Проблема в том, что StringCharacters
соответствует любой вашей входной строке, а ANTLR берет токен с максимально возможной длиной.
Для решения этой проблемы я бы предложил использовать Лексические режимы , что-то вроде:
EQ
: '=' -> pushMode(VALUE_MODE)
;
mode VALUE_MODE;
StringCharacters
: StringCharacter+ -> popMode
;
fragment
StringCharacter
: ~[\\\r\n]
;
WS : [ \t\r\n\u000C]+ -> skip
;
Обратите внимание, что приведенный выше пример сможет анализировать только одну строку.
Если вы хотите проанализировать несколько строк значений, вам нужно изменить лексер и анализатор:
Лексер:
EQ
: '=' -> pushMode(VALUE_MODE)
;
mode VALUE_MODE;
StringCharacters
: StringCharacter+ [\r\n]* -> popMode
;
fragment
StringCharacter
: ~[\\\r\n]
;
WS : [ \t\r\n\u000C]+ -> skip
;
Parser:
cell
: (operator value)*
;
operator
: EQ
;
value
: StringCharacters
;