决策可以使用多种选择来匹配输入,例如“ MULOP LETTER”:1、2

问题描述 投票:0回答:1

我遇到此错误[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+;

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

antlr antlr3 antlrworks
1个回答
0
投票

这些规则基本相同:

arithexpr 
    :    term (MULOP term)*
    ;

term    :    factor (MULOP factor)*
    ;

如果将它们组合在一起,将得到:

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

其中包含不确定性(两个MULOP令牌中的哪个应该在初始factor之后匹配?)。但是从重写很容易看出该怎么做:

arithexpr: factor (MULOP factor)*;

它将替换原始的termarithexpr规则。

© www.soinside.com 2019 - 2024. All rights reserved.