Грамматика ключа / значения ANTLR4

У меня очень простая грамматика «ключ / значение» (не та грамматика, над которой я работаю, но это самое простое, что я могу придумать и которое показывает мою проблему), которая, похоже, имеет проблемы с порядком сопоставления лексера в 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'

Что я делаю неправильно?


person Community    schedule 27.12.2012    source источник


Ответы (1)


Компилятор грамматики должен выдавать предупреждение об использовании жадного .+ в лексере.

Правило VALUE буквально гласит: «потребляйте столько символов, сколько сможете, без учета того, что это за символы». Если ваш ввод не точно hello или :, то ваш лексер будет использовать один VALUE токен, содержащий весь ввод.

Возможно, следующий лексер ближе к тому, что вам нужно:

lexer grammar textLexer;

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

mode ValueMode;

    VALUE : ~[\r\n]+ -> popMode;
person Sam Harwell    schedule 27.12.2012
comment
Хорошо, это указывает мне правильное направление. Я предполагал, что в любом случае сначала будет проанализирован абсолютный токен, но похоже, что мне нужно охватить более жадные части синтаксического анализа, чтобы они не разгулялись. Спасибо! - person ; 27.12.2012