2017-09-19 54 views
1

我想使用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://stackoverflow.com/questions/243383/why-cant-c-be-parsed-with-a-lr1-parser/1004737#1004737 –

+0

你好,我嘗試做類似的事情,你能告訴我你使用了什麼樣的庫,以及如何包含在你的pom中? – sab

回答

1

語法的入口點通常是以EOF結尾的規則。在你的情況下,嘗試translationunit規則:

ParseTree entryPoint = parser.translationunit(); 

如果人們不讀的意見,我會添加邁克值得注意的評論我的回答是:

...如果是不是這種情況(結束n EOF)機會是語法中的第一個解析器規則是入口點(特別是如果它不從任何地方調用的話)。另一方面,在我的一個語法中,我定義了六個以EOF結尾的其他規則(主要是解析我的語言的子元素)。有時候很棘手...... :-)

+1

...如果不是這樣(結束n EOF),語法中的第一個語法分析器規則就是入口點(特別是如果它不從任何地方調用的話)。另一方面,在我的一個語法中,我定義了六個以EOF結尾的其他規則(主要是解析我的語言的子元素)。有時候很棘手...... :-) –