我需要分析一些C ++源文件,以便生成一些非常基本的信息。我想做的事情是这样的:
读完每一行后,分析仪将输出以下信息:Line#:词汇信息。例如,考虑一下:
int main(int x, int y)
{
return x+y;
}
程序将输出:
Line 1: function: main, params: x, y
Line 2: paren "{"
Line 3: keyword: "return"
或类似的东西。
有人可以告诉我怎么做吗?我看过Antlr和TXL,但我猜测应该有一个更简单的方法。我想编写一个可以完成这项工作的Java程序。 我想要做的第一件事是将函数定义放在一个文件中,并带有相应的行号。任何帮助将不胜感激。
谢谢, 安东
答案 0 :(得分:3)
如果你想要你建议的输出,你就不会进行词汇分析;你至少要进行一些解析,因为你必须明白你所看到的是一个函数声明和一个对象初始化。词法分析会让你回到像
这样的东西int
main
(
int
x
,
int
y
)
{
return
x
+
y
;
}
虽然您想了解那些第一个令牌实际上定义了一个函数。
不幸的是,解析C ++是非常困难的,并且大多数解析器生成器必须经过非常专门的校准才能生成有效的C ++解析器。我建议查看现有的C ++解析器框架,可能类似于Elsa。这将以您应该能够使用的格式为您提供所需的信息。另一种选择是直接挂钩C ++编译器并处理底层AST,它为您处理所有解析和行号信息。 Treehydra工具在这里可能很有用,尽管你要编写JavaScript代码而不是Java。
希望这有帮助!
答案 1 :(得分:2)
截至今天,你最好的选择可能是CLang。
虽然CLang以在LLVM之上作为C / C ++ / Objective-C / Objective-C ++前端而闻名,但它被设计为一组库专门,以便单个组件可以是在编译器本身之外重用。
有趣的是,libclang
是一个C库,它包含核心预处理和语义分析,以便在C中提供“解析树”,因为C是通用语言。 libclang
特别是作为Python绑定的基础,所以如果你真的想用它在Java中,你应该能够使用JNI(如果我没记错的话)来与它进行交互。此外,libclang
接口非常稳定(与内部编译器表示不同),因为意味着供外部用户使用。
Python绑定已经用于创建clang_complete
,一个用于自动完成的vim插件。例如,您可以阅读此blog article(有一个非常好的视频显示它正在运行中)。
内幕人士注意:Gregory Szorc目前正在Tobias Grosser的指导下对Python绑定进行了重大改进,你可以see Gregory's announcement here。