ANTLR不清楚多种替代方案

时间:2011-11-03 05:35:21

标签: antlr grammar antlr3

我有这个语法来匹配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规则的警告。我知道当语法含糊不清时会出现这个警告,但我真的看不出含糊不清的含义。我也不理解警告信息,因为它表示输入'&'有多种选择,但'&'本身不应该是有效的输入。任何人都能指出这种含糊之处吗?我担心,当语法变得更加复杂时,它会让我感到困惑。

1 个答案:

答案 0 :(得分:1)

我认为不是这样:

or  :   and ('|' or)*
    ;

and :   unit ('&' and)*
    ;

你想要这个:

or  :   and ('|' and)*
    ;

and :   unit ('&' unit)*
    ;

你得到的表格含糊不清,因为当它处理嵌套的or(或and)时,它不知道那个是否应该继续重复,吞下下一个{{1} }(或|)或者它应该返回到外部并让它处理它。