Я пытаюсь проанализировать список пар Name=Value
, где значение может содержать все, кроме пробелов (то есть значения могут содержать знаки равенства).
Имя ограничено обычными символами идентификатора.
Проблема в том, что токен «Значение» соответствует всему. Например, для ввода:
dude=sweet
анализатор сопоставит вход целом с токеном 'Value' (и выдаст MismatchedTokenException
).
В bison была возможность назначать состояния токенам (или это было только для нетерминалов?), Так что они становятся «подходящими» для сопоставления только после явного перехода в это состояние.
РЕДАКТИРОВАТЬ Если подумать, это не сработает и в бизонах - разделение токенов уже произошло (в flex ); однако, я думаю, что был способ получить REJECT
токенов, заставив flex попробовать второй лучший матч.
Вот моя грамматика ANTLR.
grammar command_string;
start
: commandParam* EOF
;
commandParam
: IDENTIFIER '=' CONTINUOUS_VALUE
;
IDENTIFIER
: ('-'|'_'|'a'..'z'|'A'..'Z'|'0'..'9')+
;
CONTINUOUS_VALUE
: ~( ALL_WS )+
;
WS
: (ALL_WS) + { $channel = HIDDEN; }
;
fragment ALL_WS
: ' ' | '\t' | '\r' | '\n'
;