2

Antlr は、入力文字列から ~、@、#、$、%、*、(、)、{、}、[、] などの文字を何らかの形で無視します。

show~~~、show ~@#$% などの入力文字列を使用して以下の文法をテストしましたが、Antlr は eclipse/antlr の動作インタープリターで文字をエスケープします。そのようなシナリオで例外をスローし、それらから回復しないようにしたいと考えています。以前にこれに直面したことがあるかどうか、もしそうなら、それを取り除くために何をしたか教えてください.

grammar Sample; 
options {language = Java;} @header {package a.b.c;} @lexer::header {package a.b.c;} 
prog: stat+ ; stat: expr ; expr: paramValueChildStructure ; 
paramValueChildStructure: ALPHANUMERIC;
ALPHANUMERIC: ('a'..'z' |'A'..'Z' | '0'..'9')+ ;

上記の問題を取り除くために以下のオプションを試しましたが、これにより、生成された lexer.java で到達不能なコードのコンパイル時間の問題が発生します

OTHER      : . {throw new RuntimeException("unknown char: '" + $text + "'");};

ありがとう、アシッシュ

4

1 に答える 1

1

ここを見てください: http://www.antlr3.org/wiki/display/ANTLR3/Custom+Syntax+Error+Recovery

結論の前の最後の段落は、おそらく必要なものです。

ANTLR ランタイム内のその他の回復メカニズム

カスタマイズが必要なリカバリの側面がもう 1 つあります。これは、mismatch() が発生したときに発生します。生成されたコードに、match() メソッドへの呼び出しが多数あることがわかります。デフォルトの実装を (Java ランタイムで) 調べると、match メソッドがメソッド recoverFromMismatchedToken() を呼び出し、これが現在のフォロー セット スタックを使用して、不一致の理由がスプリアス トークンであるかどうかを判断しようとすることがわかりました。入力: XZ のみが必要な場合は XYZ、または不足しているトークン: XY Z が必要な場合は XZ.偽のトークン、余分なトークンを報告しますが、RecognitionException は発生しません。同様に、

これとは異なる動作が必要な場合は、match() メソッド、またはおそらくは recoverFromMismatchedToken() メソッドをオーバーライドできます。おそらく、スプリアス/欠落エラーの検出は必要ありませんか? または、デフォルトの実装からわかるように、ANTLR は最初にトークンを無視することで問題を解決できるかどうかを確認し、次にトークンを追加して問題を解決できるかどうかを確認します。ただし、いずれかの方法を使用して回復できる構文エラーがいくつかあります。おそらく、これらの方法を試す順序を逆にしたいですか?

于 2013-03-27T16:30:13.410 に答える