我遇到此错误[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+;
我希望编写没有错误消息的语法,所以我可以为其生成一个词法分析器和解析器。
这些规则基本相同:
arithexpr
: term (MULOP term)*
;
term : factor (MULOP factor)*
;
如果将它们组合在一起,将得到:
arithexpr: factor (MULOP factor)* (MULOP factor (MULOP factor)*)*
其中包含不确定性(两个MULOP令牌中的哪个应该在初始factor
之后匹配?)。但是从重写很容易看出该怎么做:
arithexpr: factor (MULOP factor)*;
它将替换原始的term
和arithexpr
规则。