Решение может соответствовать входным данным, таким как «ПИСЬМО МУЛОП», используя несколько альтернатив: 1, 2 - PullRequest
0 голосов
/ 27 октября 2019

Я получаю эту ошибку [22:52:55] предупреждение (200): ProjLang.g: 53: 30: Решение может соответствовать входным данным, таким как «ПИСЬМО МУЛОП», используя несколько альтернатив: 1, 2

В результате альтернатива (ы) 2 были отключены для этого ввода

Кажется, что в моей грамматике может быть некоторая двусмысленность из-за моего поиска в Google. Я не знаю, как я могу устранить неоднозначность.

fragment LETTER 
    :   ('a'..'z') | ('A'..'Z');
fragment DIGIT  
    :   ('0'..'9');
ADDOP   :   ('+'|'-'|'|')
    ;
MULOP   :   ('*'|'/'|'&')
    ;

RELOP   :   ('<'|'=')
    ;
LPAR    :   '(';
RPAR    :   ')';
BOOL    :    'true'|'false';
LCURL   :   '{';
RCURL   :   '}';

// parser rules: non terminal states should be lowercase

input   :    expr EOF
    ;

expr    :   'if' expr 'then' expr 'else' expr
    |   'let'( 'val' id RELOP expr 'in' expr 'end'|'fun' id LPAR id RPAR RELOP expr 'in' expr 'end')    
    |   'while' expr 'do' expr
    |   LCURL expr (';'expr)* RCURL
    |   '!'expr
    |   id ':=' expr
    |   relexpr
    ;

relexpr 
    :    arithexpr (RELOP arithexpr)?
    ;

arithexpr 
    :    term (MULOP term)*
    ;

term    :    factor (MULOP factor)*
    ;

factor  :    num
    |    BOOL
    |    id (LPAR expr RPAR)?
    |    LPAR expr RPAR
    ;

id  :   LETTER (LETTER | DIGIT)*;
num :   DIGIT+;

Я рассчитываю написать грамматику без сообщения об ошибке, чтобы я мог сгенерировать лексер и парсер для нее.

1 Ответ

0 голосов
/ 27 октября 2019

Эти правила, по сути, одинаковы:

arithexpr 
    :    term (MULOP term)*
    ;

term    :    factor (MULOP factor)*
    ;

Если вы их объедините, вы получите:

arithexpr: factor (MULOP factor)* (MULOP factor (MULOP factor)*)*

, который содержит неопределенность (какой из двух токенов MULOP должен совпадатьпосле начальных factor?). Но из переписанного легко увидеть, что делать:

arithexpr: factor (MULOP factor)*;

, который заменяет оригинальные правила term и arithexpr.

...