2016-12-21 3 views
0

私はANTLR4を使用しています。特に、そのレポ(grammar)で利用可能なC文法を使用しています。文法には初期のルールがないと思われるので、どのように入手できるのだろうかと思っていました。私は呼んで私の例ではANTLR最初の生産を取得する

int a;

int foo() { return 0; } 

:実際には、一度パーサを初期化し、私は自分のリスナーを添付して、私は別のコード命令との2つのファイルを解析しようとしているので、私は構文エラーを取得します"g4"ファイルの最初の生成である"parser.primaryExpression();"のパーサー。代わりにANTLRによって自動的に最初のプロダクションを呼び出すことは避けられますか?

答えて

0

また、(生成されたパーサで)ルールの列挙型は、彼らが文法に表示されている順序で各ルールのエントリが含まれており、最初のルールだけで、しかし、値0を持っていますそれが文法の最初のルールであるからといって、それがメインエントリーポイントであるということではありません。文法の作者だけが実際のエントリが何であるかを知っていますし、時にはサブルールとのみパースしたいこともあります。

+0

"[...]場合によっては、サブグルールのみを解析することもできます。"はい、ただし動作​​しないことがあります(http://stackoverflow.com/questions/41281882/antlr4-not-reporting-ambiguityを参照)。 ANTLR4は、他の誰かによって呼び出されない各ルールに暗黙的にEOFトークンを追加します(これらのルールをルーツと考えているかもしれません)。 – rslemos

+0

うーん、私はそれを信じていない。私は特にそれをチェックしていませんが、ルールが消費し、成功したものよりも多くの情報が含まれており、追加の入力は無視されています。その規則の最後に明示的なEOFがあった場合、それは極度の入力のせいで失敗したでしょう。 –

0

ANTLRでは、最初のルールを取得するためのAPIは提供されていません。しかし、生成されたパーサでは、フィールドは文法の出現順に序列を列挙する。リフレクションを使用すると、メソッドにアクセスできます。

注意してください。 Antlr 'spec'にはこの順序付けが定義されていません。単にこれまでのところ真実でした。 GRosenbergの答え@に加えて

関連する問題