Я начал использовать ANTLR и заметил, что он довольно изменчив с его правилами lexer. Очень неприятным примером является следующее:
grammar output;
test: FILEPATH NEWLINE TITLE ;
FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
NEWLINE: '\r'? '\n' ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;
Эта грамматика не будет соответствовать чему-то вроде:
C:\test.txt
х
Как ни странно, если я изменяю TITLE
на TITLE: 'x' ;
, он все равно терпит неудачу на этот раз, вызывая сообщение об ошибке "mismatched input" x "Ожидание" x ", что сильно запутывает. Еще более странно, если я заменю использование TITLE
в test
на FILEPATH
, все работает (хотя FILEPATH
будет соответствовать больше, чем я считаю совпадением, поэтому в целом это недействительное решение для меня).
Я очень смущен, почему ANTLR дает такие чрезвычайно странные ошибки, а затем внезапно работает без видимых причин, когда тасует вещи.