0

基本的に、BaseErrorListener を拡張したので、エラーがセマンティックな場合と構文上の場合を知る必要があります。したがって、次のようにして述語の例外を失敗させたいのですが、NoViableAltException代わりに を取得しています ( の値を出力できるため、カウントが機能していることはわかっていますがthings、それは正しいです)。私がやりたいことをやり直す方法はありますか?以下の私の例では、 6 に終わらない場合、失敗した述語の例外が必要ですthings

grammar Test;

@parser::members {
    int things = 0;
}
.
.
.
samplerule : THING { things++; } ;
.
.
.
// Want this to be a failed predicate instead of NoViableAltException
anotherrule : ENDTOKEN { things == 6 }? ;
.
.
.

私はすでに次のように失敗した述語例外を適切に取得しています(別のシナリオの場合):

somerule : { Integer.valueOf(getCurrentToken().getText()) < 256 }? NUMBER ;
.
.
.
NUMBER : [0-9]+ ;
4

2 に答える 2

1

ANTLR 4 では、述語は、入力が 2 つの異なる解析ツリー (あいまいな文法) につながり、デフォルトの処理が間違った解析ツリーを生成する場合にのみ使用する必要があります。ソースのセマンティック検証用のロジックを含むリスナーまたはビジターの実装を作成する必要があります。

于 2013-10-02T19:31:26.607 に答える