Antlr 为什么我的语法适用于像*、-、/,但不适用于+;?

Antlr 为什么我的语法适用于像*、-、/,但不适用于+;?,antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,我现在正在创建一个语法,我必须摆脱左递归,它似乎适用于除加法运算符之外的所有操作 以下是我语法的相关部分: SUBTRACT: '-'; PLUS: '+'; DIVIDE: '/'; MULTIPLY: '*'; expr: ( IDENTIFIER | INTEGER | STRING | TRUE | FALSE ) ( PLUS expr

我现在正在创建一个语法,我必须摆脱左递归,它似乎适用于除加法运算符之外的所有操作

以下是我语法的相关部分:

SUBTRACT: '-';
PLUS: '+';
DIVIDE: '/';
MULTIPLY: '*';

expr: 
      (
        IDENTIFIER 
        | INTEGER 
        | STRING 
        | TRUE 
        | FALSE
      )
      (
        PLUS expr 
        | SUBTRACT expr 
        | MULTIPLY expr 
        | DIVIDE expr 
        | LESS_THAN expr 
        | LESS_THAN_OR_EQUAL expr 
        | EQUALS expr
      )*
      ;

INTEGER: ('0'..'9')*;
IDENTIFIER: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*;
然后当我试着做一些像

x*1
x+1
它工作得很好。然而,当我尝试做类似的事情时

x*1
x+1
我得到一个错误,说:

不匹配的TokenException:不匹配的输入“+”应为“\u001C”

我已经做了一段时间了,但不明白为什么它与*、-、和/,而不是+一起工作。我对所有这些都有完全相同的代码


编辑:如果我对其重新排序并将减法置于加号之上,则+符号现在可以工作,但-符号不能。为什么antlr会关心这样的事情的顺序呢?

我通过在末尾为删除左递归所做的部分制定一个新规则来解决这个问题:

expr: 
      (
        IDENTIFIER 
        | INTEGER 
        | STRING 
        | TRUE 
        | FALSE
      ) lr*
      ;

lr:         PLUS expr 
        | SUBTRACT expr 
        | MULTIPLY expr 
        | DIVIDE expr 
        | LESS_THAN expr 
        | LESS_THAN_OR_EQUAL expr 
        | EQUALS expr;
避免左递归(在表达式语法中)通常是这样做的:

grammar Expr;

parse
  :  expr EOF
  ;

expr
  :  equalityExpr
  ;

equalityExpr
  :  relationalExpr (('==' | '!=') relationalExpr)*
  ;

relationalExpr
  :  additionExpr (('>=' | '<=' | '>' | '<') additionExpr)*
  ;

additionExpr
  :  multiplyExpr (('+'| '-') multiplyExpr)*
  ;

multiplyExpr
  :  atom (('*' | '/') atom)*
  ;

atom
  :  IDENTIFIER
  |  INTEGER
  |  STRING
  |  TRUE
  |  FALSE
  |  '(' expr ')'
  ;

// ... lexer rules ...
语法表达式;
作语法分析
:expr EOF
;
expr
:equalityExpr
;
等式表达式
:relationalExpr((“==”|“!=”)relationalExpr)*
;
关系表达式

:additionExpr((“>=”|“|”什么是标识符、整数等。定义为什么?您的整数表达式中是否包含
+
?哎呀,我刚刚添加了问题中的整数和标识符。我相信我现在已经有了所有相关的东西。整数规则中没有+了。这不是方法:表达式
2*3+4
是正确的g解析为
(2*(3+4))
(即
+
现在比
*
具有更高的优先级)。谢谢。我首先误读了一些内容,最终导致在我自己的语法中找到并修复了错误,谢谢!