【发布时间】:2018-02-28 19:52:40
【问题描述】:
我正在尝试使用 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++ 源文件的工作示例的任何指针都会很棒。
谢谢!
【问题讨论】:
-
C++ 语法不明确。尝试用纯语法解析它(没有外部特别帮助来消除歧义)将失败。这里使用的语法似乎没有任何这样的外部帮助。可能有可能对其进行修补(毕竟 Clang 一个 GCC 设法仅通过递归下降来解析 C++),但这样做的努力可能比您想象的要大得多。然后你会遇到预处理器代码。更多详情请见stackoverflow.com/questions/243383/…
-
您好,我尝试做类似的事情,您能告诉我您使用什么库,以及您如何在 pom 中包含 -it 吗?