1

ANTLR 4.0b4のレクサーの一致順序に問題があるように見える、非常に単純なキー/値文法(実際に取り組んでいる文法ではありませんが、これは私の問題を示す最も単純な文法です)があります。文法は次のとおりです。

grammar test;

r     : HELLO COLON VALUE;
HELLO : 'hello';
COLON : ':';
VALUE : .+;

この文法と入力'hello:world'を考えると、正しく解析されると思いますが、入力全体が単一のVALUEトークンに取り込まれるため、失敗するようです。

hello:world
[@0,0:11='hello:world\n',<3>,1:0]
[@1,12:11='<EOF>',<-1>,2:12]
line 1:0 mismatched input 'hello:world\n' expecting 'hello'

私は何が間違っているのですか?

4

1 に答える 1

3

.+文法コンパイラは、レクサーでの貪欲な使用について警告を発する必要があります。

ルールは文字通り「VALUE文字が何であるかを考慮せずに、できるだけ多くの文字を消費する」と言っています。入力が正確に helloまたはでない場合、レクサーは入力全体を含む:単一のトークンを消費します。VALUE

おそらく、次のレクサーはあなたが求めているものに近いでしょう:

lexer grammar textLexer;

HELLO : 'hello';
COLON : ':' -> pushMode(ValueMode);

mode ValueMode;

    VALUE : ~[\r\n]+ -> popMode;
于 2012-12-27T03:03:34.910 に答える