АНТЛР неясно несколько альтернатив - PullRequest
1 голос
/ 03 ноября 2011

У меня есть эта грамматика, чтобы соответствовать простым логическим предикатам в 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 Ответ

1 голос
/ 03 ноября 2011

Я думаю, что вместо этого:

or  :   and ('|' or)*
    ;

and :   unit ('&' and)*
    ;

вы хотите это:

or  :   and ('|' and)*
    ;

and :   unit ('&' unit)*
    ;

Форма, которую вы получили, неоднозначна, потому что при обработке этого вложенного or (или and) он не знает, должен ли тот продолжать повторять, проглотив следующий | (или &) или должен вернуться к внешнему и позволить ему обработать его.

...