首页 > 解决方案 > 决策可以使用多种选择匹配诸如“MULOP LETTER”之类的输入:1、2

问题描述

我收到此错误 [22:52:55] 警告(200):ProjLang.g:53:30:决策可以使用多种选择匹配输入,例如“MULOP LETTER”:1、2

结果,该输入禁用了备选方案 2

从我的谷歌搜索来看,我的语法似乎有些歧义。我不知道如何消除歧义。

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+;

我希望编写一个没有错误消息的语法,这样我就可以为它生成一个词法分析器和一个解析器。

标签: antlrantlr3antlrworks

解决方案


这些规则的作用基本相同:

arithexpr 
    :    term (MULOP term)*
    ;

term    :    factor (MULOP factor)*
    ;

如果你把它们结合起来,你会得到:

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

其中包含一个歧义(两个 MULOP 标记中的哪一个应该在初始 ? 之后匹配factor?)。但是从重写中很容易看出要做什么:

arithexpr: factor (MULOP factor)*;

它取代了原来的termarithexpr规则。


推荐阅读