我有这个语法来匹配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
规则的警告。我知道当语法含糊不清时会出现这个警告,但我真的看不出含糊不清的含义。我也不理解警告信息,因为它表示输入'&'有多种选择,但'&'本身不应该是有效的输入。任何人都能指出这种含糊之处吗?我担心,当语法变得更加复杂时,它会让我感到困惑。
答案 0 :(得分:1)
我认为不是这样:
or : and ('|' or)*
;
and : unit ('&' and)*
;
你想要这个:
or : and ('|' and)*
;
and : unit ('&' unit)*
;
你得到的表格含糊不清,因为当它处理嵌套的or
(或and
)时,它不知道那个是否应该继续重复,吞下下一个{{1} }(或|
)或者它应该返回到外部并让它处理它。