有没有一个用于解析printf格式字符串的Java库?

6
我正在为一个带有'printf'操作码的机器编写模拟器,虽然我知道 Formatter 类可能已经足够好来实际格式化字符串,但我需要一种方法来计算 printf 调用消耗的参数数量。
就我个人而言,我可以通过正则表达式来计算 '%' 的数量,但我对格式化字符串不是很熟悉,所以可能无法正确计数(排除转义字符等)...
编辑:实际上,我需要参数的数量以及参数编号到参数类型的映射,因此,例如,“hello %s %+.3i”将给出 {0->String,1-> Integer}。

1
你是在寻找解析 Formatter 类的格式字符串或 C printf 的格式字符串吗?(例如,支持 %*s%*.*f 字符串,它们需要 2 或 3 个参数,因此你不能仅仅计算 %s 的数量) - Jason S
1
在我的情况下适用的唯一参数类型是字符、32位有符号整数、64位双精度以及以null结尾的字符串。否则它应该像C printf一样工作,因此我猜格式化程序并不完全正确,但对于我的目的来说它可能会起作用,因为输入来自我编写的编译器。 - Bwmat
嗯。如果你写了一个编译器,那么你不可以为你想要支持的任何变体的 printf() 编写一个(相对)简单的语法解析器,并使用抽象语法树来生成参数计数吗?这比一个简单的库调用更费力,但如果你有像 ANTLR 或其他工具来进行解析,我认为这并不难,而且你可以确保你的程序正常工作。我提出这个问题的唯一原因是完整的 printf 解析并不容易。如果你可以不使用可变宽度语法,那么这会使它变得简单很多,你可能可以用正则表达式来实现。 - Jason S
printf操作码的行为有点不太明确。它不支持“I64”(宽整数)或“n”或“p”(指针)说明符的C风格printf。我在编译器课程的“娱乐”背景下进行这个项目,我真的不想自己处理格式字符串的复杂性。 - Bwmat
2个回答

7

格式化字符串将每个 % 解释为占位符,字面量的 % 被转义为 %%,因此应该像这样简单:

String formatString;
int parameterCount = formatString.replace("%%", "").split("%").length - 1;

这段代码首先删除了所有转义(重复)的 %,然后通过分割计算了 % 的数量。

其实,现在我想起来了,我实际上需要一个参数编号->参数类型的映射,唉。 - Bwmat

1

为什么不使用类似于%(?:%|[0-9]+([dox]))的正则表达式,并以这种方式检查格式类型说明符呢?

还有另一个关于使用正则表达式解析sprintf格式字符串的SO主题,这可能会给您一些更多的想法。除非您指定了printf()的哪些特性,否则很难推荐一个精确的正则表达式。

或者,正如我在评论中提到的那样,如果您已经使用了其他编译器工具,比如ANTLR或Parboiled,可以通过简单的语法规范将格式字符串拆分成适当的部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接