Согласно документам ANTLR4 правила лексера и синтаксического анализатора жадные , что соответствует максимально возможному вводу .В вашем случае:
'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z\\'';
^^^
'cd';
Ваша грамматика несколько двусмысленна - символы, которые я выделил, могут интерпретироваться как \'
'
или как \
''
.Посмотрите, как это работает.
Без 'cd'
лексер соответствует строке, потому что это допустимая строка для вашей грамматики, выделенные символы соответствуют \'
'
.Но поскольку лексер является жадным, он будет использовать вышеупомянутую неоднозначность для сопоставления нежелательных входных данных при первой возможности, например, при добавлении еще одного неэкранированного '
где-то позже.
Эта неоднозначность вызвана тем, что обратный слеш является либо нормальным символом, либопобег персонажа.Распространенным решением для устранения такой неоднозначности является правило для экранирования самого обратного слеша : \\
, также вам необходимо не соответствовать ему как обычному символу .
В качестве альтернативы, вы можете решить проблему неоднозначности по-другому.Если вы хотите расставить приоритеты \'
над ''
, вы должны написать:
L_S_STRING : '\'' ( ('\'\'') | ('\\'+ ~'\\') | ~('\'' | '\\') )* '\'' ;
Это будет работать для вашего ввода.
Кстати, вы можете сократить свой код для L_WS:
L_WS : [ \t\n\r]+ -> skip ;