0

antlr が表示するエラー メッセージを改善しようとしていますが、構文述語が不適切なエラー メッセージの原因であることに気付きました。

これは私が現在取り組んでいるものです。文法の構造の例を次に示します。申し訳ありませんが、実際の文法を提供することはできません。うまくいけば、これは要点を示しています。

defs
:   (a) => a | b
;


a
:   A B c
;

//b is actually much further down the chain and due to ordering can't be moved up.
b
:   A c
;

問題は、たとえばトークン「AB D」がある場合です。表示されるエラー メッセージは、'b' ルールによるものです。エラーメッセージを「a」ルールからのものにしたい。「A B」が一致する場合、「c」が一致しない場合はエラーが必要です。

私はあなたがこれを行うことができるかもしれないと思った

a
:   (A B) => A B c | {EmitErrorMessage("error");}
;
4

1 に答える 1

1

defsに 1 つ追加する代わりに、 の構文述語を緩和する必要がありaます。

defs
    :   (A B) => a
    |   b
    ;

これにより、パーサーは最初の選択肢を選択しa、2 つのシンボルだけに基づいてルールを入力しますA B

于 2013-04-22T22:38:42.200 に答える