Java中非常简单的C ++词法分析

时间:2012-02-05 00:19:52

标签: c++ parsing compiler-construction lexical-analysis

我需要分析一些C ++源文件,以便生成一些非常基本的信息。我想做的事情是这样的:

  1. 假设我们有C ++语法和要分析的C ++源文件
  2. 分析器将像词法分析器一样读取源文件,它将识别C ++语法定义的关键字等。
  3. 读完每一行后,分析仪将输出以下信息:Line#:词汇信息。例如,考虑一下:

    int main(int x, int y)
    {
       return x+y;
    }
    
  4. 程序将输出:

        Line 1: function: main, params: x, y
        Line 2: paren "{"
        Line 3: keyword: "return"
    

    或类似的东西。

    有人可以告诉我怎么做吗?我看过Antlr和TXL,但我猜测应该有一个更简单的方法。我想编写一个可以完成这项工作的Java程序。 我想要做的第一件事是将函数定义放在一个文件中,并带有相应的行号。任何帮助将不胜感激。

    谢谢, 安东

2 个答案:

答案 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