使用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++源文件的工作示例的指针都会很好。

谢谢!

+0

C++语法不明确。试图用纯语法来解析它(没有外部临时帮助消除歧义)将会失败。这里使用的语法似乎没有任何这种外部帮助。有可能对它进行修补(毕竟Clang和GCC设法只用递归下降来解析C++),但这样做的努力可能会比你想象的要大得多。然后你会遇到预处理器代码。有关更多详细信息,请参阅https://*.com/questions/243383/why-cant-c-be-parsed-with-a-lr1-parser/1004737#1004737 –

+0

你好,我尝试做类似的事情,你能告诉我你使用了什么样的库,以及如何包含在你的pom中? – sab

语法的入口点通常是以EOF结尾的规则。在你的情况下,尝试translationunit规则:

ParseTree entryPoint = parser.translationunit(); 

如果人们不读的意见,我会添加迈克值得注意的评论我的回答是:

...如果是不是这种情况(结束n EOF)机会是语法中的第一个解析器规则是入口点(特别是如果它不从任何地方调用的话)。另一方面,在我的一个语法中,我定义了六个以EOF结尾的其他规则(主要是解析我的语言的子元素)。有时候很棘手...... :-)

+1

...如果不是这样(结束n EOF),语法中的第一个语法分析器规则就是入口点(特别是如果它不从任何地方调用的话)。另一方面,在我的一个语法中,我定义了六个以EOF结尾的其他规则(主要是解析我的语言的子元素)。有时候很棘手...... :-) –