以下语法未能区分否定和减法操作。它完全忽略了否定操作。
我认为这种情况正在发生,因为存在歧义...... negAtom
与OPERATOR multOp
非常相似。我如何重写我的语法以适应否定和减法,同时保持运算符优先级乘法和除法?
grammar Expr.g4
op:
multOp (OPERATOR multOp)*;
multOp:
negAtom (MULT_OPERATOR multOp)*;
negAtom:
NEG? atom;
atom:
group | INT;
group:
L op R;
L : '(';
R : ')';
NEG : '-';
ADD : '+';
MLT : '*';
DIV : '/';
OPERATOR : (NEG|ADD);
MULT_OPERATOR : (MLT|DIV);
INT : '0'..'9'+;
示例解析树,输入" -1":
答案 0 :(得分:1)
OPERATOR
永远不会匹配,因为NEG
或ADD
首先匹配。
简而言之:可匹配的第一个词法分析器规则将匹配。
你应该像OPERATOR
这样的词法分析规则使用像operator
这样的解析器规则。
这个问题已经解决了很多次。看看现有的语法。
对于Antlr4语法,请看这里:list of antlr4 grammars at github