我尝试使用ANTLR来解析C ++源代码,使用ANTLR C++ grammar file。
生成词法分析器,解析器和侦听器(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 ++源文件的工作示例的任何指针都会很棒。
谢谢!
答案 0 :(得分:1)
语法的入口点通常是以git branch -a
结尾的规则。在您的情况下,请尝试EOF
规则:
translationunit
如果人们不阅读评论,我会在我的回答中添加Mike的值得注意的评论:
...如果不是这种情况(结束n EOF),则语法中的第一个解析器规则是入口点(特别是如果它不是从任何地方调用的话)。另一方面,在我的一个语法中,我定义了六个以EOF结尾的其他规则(主要用于解析我语言的子元素)。有时它很棘手......: - )