使用C++语法的ANTLR解析器示例
我想使用ANTLR解析C++源代码,使用ANTLR C++ grammar file。使用C++语法的ANTLR解析器示例
产生的词法,语法分析器和听众(CPP14BaseListener.java,CPP14Lexer.java,CPP14Listener.java,CPP14Parser.java),试图在C运行它以这种方式++文件后:
private void parseCppFile(String file) throws IOException {
String p1 = readFile(new File(file), Charset.forName("UTF-8"));
System.out.println(p1);
// Get our lexer
CPP14Lexer lexer = new CPP14Lexer(new ANTLRInputStream(p1));
// Get a list of matched tokens
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Pass the tokens to the parser
CPP14Parser parser = new CPP14Parser(tokens);
// Walk it and attach our listener
ParseTreeWalker walker = new ParseTreeWalker();
// Specify our entry point
ParseTree entryPoint = null;//TODO: what is the entry point?
walker.walk(new CPP14BaseListener(), entryPoint);
}
我问题是 - 哪个CPP14Parser生成了用于获取解析文件入口点的方法? (见TODO评论)。
或者,任何指示如何解析C++源文件的工作示例的指针都会很好。
谢谢!
语法的入口点通常是以EOF
结尾的规则。在你的情况下,尝试translationunit
规则:
ParseTree entryPoint = parser.translationunit();
如果人们不读的意见,我会添加迈克值得注意的评论我的回答是:
...如果是不是这种情况(结束n EOF)机会是语法中的第一个解析器规则是入口点(特别是如果它不从任何地方调用的话)。另一方面,在我的一个语法中,我定义了六个以EOF结尾的其他规则(主要是解析我的语言的子元素)。有时候很棘手...... :-)
...如果不是这样(结束n EOF),语法中的第一个语法分析器规则就是入口点(特别是如果它不从任何地方调用的话)。另一方面,在我的一个语法中,我定义了六个以EOF结尾的其他规则(主要是解析我的语言的子元素)。有时候很棘手...... :-) –
C++语法不明确。试图用纯语法来解析它(没有外部临时帮助消除歧义)将会失败。这里使用的语法似乎没有任何这种外部帮助。有可能对它进行修补(毕竟Clang和GCC设法只用递归下降来解析C++),但这样做的努力可能会比你想象的要大得多。然后你会遇到预处理器代码。有关更多详细信息,请参阅https://*.com/questions/243383/why-cant-c-be-parsed-with-a-lr1-parser/1004737#1004737 –
你好,我尝试做类似的事情,你能告诉我你使用了什么样的库,以及如何包含在你的pom中? – sab