在ANTLR表达语法中区分否定和减法

时间:2014-06-26 18:18:44

标签: antlr3 antlr4

以下语法未能区分否定和减法操作。它完全忽略了否定操作。

我认为这种情况正在发生,因为存在歧义...... negAtomOPERATOR 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":

Parse tree with input "-1"

1 个答案:

答案 0 :(得分:1)

OPERATOR永远不会匹配,因为NEGADD首先匹配。 简而言之:可匹配的第一个词法分析器规则将匹配。

你应该像OPERATOR这样的词法分析规则使用像operator这样的解析器规则。

这个问题已经解决了很多次。看看现有的语法。

对于Antlr4语法,请看这里:list of antlr4 grammars at github