2017-09-19 17 views
1

ANTLR C++ grammar fileを使用して、C++ソースコードの解析にANTLRを使用しようとしています。ANTLRパーサの例(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); 
} 

マイ:この方法でC++ファイルでそれを実行しようとすると、(CPP14BaseListener.java、CPP14Lexer.java、CPP14Listener.java、CPP14Parser.java)レクサー、パーサとリスナーを生成した後

質問は、CPP14Parserがファイルの解析のエントリポイントを取得するために使用するメソッドを生成しましたか? (TODOコメントを参照)。

また、C++ソースファイルを解析する方法を示す実例のポインタは素晴らしいでしょう。

ありがとうございます!

+0

C++にはあいまいな構文があります。純粋な文法でそれを解析しようとすると(曖昧さ回避のための特別な助けなしに)失敗するでしょう。ここで使われている文法は、そのような外部の助けを持っていないようです。パッチを当てることができます(GCCがC++を解析して再帰的な降下を行った後も可能です)が、そうしようとする努力はあなたが考えるよりもはるかに大きい可能性があります。そして、プリプロセッサコードを実行します。詳細については、https://stackoverflow.com/questions/243383/why-cant-c-be-parsed-with-a-lr1-parser/1004737#1004737 –

+0

を参照してください。こんにちは、私は同様のことをやろうとします。どのようなlibを使っているのか、どのようにあなたのpomに入れるのか教えてください。 – sab

答えて

1

通常、文法のエントリポイントは、EOFで終わるルールです。

を...、それがある場合:人がコメントを読んでいない場合、私は私の答えにマイクの注目すべきコメントを追加します

ParseTree entryPoint = parser.translationunit(); 

:あなたのケースでは、translationunitルールを試してみてください(EOFで終わる)チャンスは文法の最初のパーサールールであり、エントリポイント(特にどこからでも呼び出されない場合)です。一方、私の文法の1つでは、EOFで終わる残りの12個のルールを定義しました(主に私の言語の下位要素を解析する)。時にはそれは難しいです:...-)

+1

...そうでない場合(n EOFで終わる)、文法の最初のパーサールールはエントリポイントです(特にどこからでも呼び出されない場合)。一方、私の文法の1つでは、EOFで終わる残りの12個のルールを定義しました(主に私の言語の下位要素を解析する)。時々それはトリッキーです:...-) –