У меня есть эта грамматика, чтобы соответствовать простым логическим предикатам в ANTLR.
exp : or
;
or : and ('|' or)*
;
and : unit ('&' and)*
;
unit : '(' or ')' |
STRING
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
STRING
: '\'' ( ESC_SEQ | ~('\\'|'\'') )* '\''
;
fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
fragment
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| UNICODE_ESC
| OCTAL_ESC
;
fragment
OCTAL_ESC
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
fragment
UNICODE_ESC
: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
;
Я получаю предупреждение Decision can match input such as "'&'" using multiple alternatives: 1, 2
, а также предупреждение для правила or
. Я знаю, что это предупреждение появляется, когда в грамматике есть неясности, но я действительно не вижу, что это за двусмысленность. Я также не понимаю предупреждающее сообщение, потому что оно говорит, что у ввода & есть несколько альтернатив, но само по себе '&' не должно быть допустимым. Кто-нибудь может указать на двусмысленность? Я волнуюсь, что это может испортить меня позже, когда грамматика станет более сложной.