<分区>
我有一组用 C 语言编写的源代码文件,我需要生成解析以从文件中提取变量和函数的名称。
我发现我可以用 AntLR 做到这一点。我已经有了 C 语法,但我不知道我应该按照我所说的执行哪些步骤。
请有人给我提示如何进行,例如,我应该生成一个监听器还是一个访问者?
谢谢!
<分区>
我有一组用 C 语言编写的源代码文件,我需要生成解析以从文件中提取变量和函数的名称。
我发现我可以用 AntLR 做到这一点。我已经有了 C 语法,但我不知道我应该按照我所说的执行哪些步骤。
请有人给我提示如何进行,例如,我应该生成一个监听器还是一个访问者?
谢谢!
最佳答案
Antlr 为您生成监听器接口(interface)。所以你只需要实现这个接口(interface),然后使用你的实现实例来遍历解析树。
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
现在您有了解析树,您可以使用自己实现的生成的监听器接口(interface) 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
关于java - 使用 AntLR 4 获取变量和函数的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23293758/