我有一组用C语言编写的源代码文件,我需要生成一个解析来从文件中提取变量和函数的名称。
我发现我可以用AntLR做到这一点。我已经有了C语法,但我不知道我应该遵循的步骤是什么。
请有人给我一些如何处理的提示,例如,我应该生成一个听众还是访客?
谢谢!
答案 0 :(得分:3)
Antlr为您生成侦听器接口。所以你只需要实现这个接口,然后使用你的实现实例来遍历解析树。
Antlr是一个解析器生成器,所以如果您还没有完成它,请使用您的语法文件生成解析器源代码。
假设您的C语法位于名为TheC.g4
的文件中,请使用antlr4
生成源:
antlr4 TheC.g4
此步骤的输出是包含解析器实现的几个生成的java源文件。您可以使用javac
编译源代码,如:
javac TheC*.java
现在您可以编写自己的java代码,使用上面生成的词法分析器和解析器类来解析C源文件。
TheCLexer lexer = new TheCLexer(input); // use the generated lexer to tokenize the C source
CommonTokenStream tokens = new CommonTokenStream(lexer);
TheCParser parser = new TheCParser(tokens);
ParserRuleContext<Token> tree = parser.compilationUnit(); // <<--This part will be different for you depending on the root of your grammar
现在您已经拥有了解析树,您可以使用自己生成的侦听器接口TheCListener
的实现来使用树
ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker
MyListener extractor = new MyListener(parser); // MyListener is your implementation of TheCListener interface
walker.walk(extractor, tree); // initiate walk of tree with listener
注意:以上所有代码示例均来自此page