Java 具有基本算术和符号表达式的Antlr4语法

Java 具有基本算术和符号表达式的Antlr4语法,java,math,compiler-construction,antlr,antlr4,Java,Math,Compiler Construction,Antlr,Antlr4,我正在学习Antlr4编写一种基本算术语言。目前,我已经为基本算术运算符*+-/编写了一个语法。 这是我的语法: grammar Expr; // rename to distinguish from Expr.g4 prog: stat (';' stat)* ; stat: ID '=' expr (';'|',')? # assign | expr (';')? # printExpr

我正在学习Antlr4编写一种基本算术语言。目前,我已经为基本算术运算符
*
+
-
/
编写了一个语法。 这是我的语法:

grammar Expr; // rename to distinguish from Expr.g4

prog:   stat (';' stat)* ;

stat:   ID '=' expr (';'|',')?              # assign
    |   expr (';')?                         # printExpr
    ;

expr:   op=('-'|'+') expr                    # signed
    |   expr op=('*'|'/') expr               # MulDiv
    |   expr op=('+'|'-') expr               # AddSub
    |   ID                                   # id                 
    |   DOUBLE                               # Double
    |   '(' expr ')'                         # parens
    ;



MUL :   '*' ; // assigns token name to '*' used above in grammar
DIV :   '/' ;
ADD :   '+' ;
SUB :   '-' ;
ID  :   [a-zA-Z]+ [0-9]* ;      // match identifiers
DOUBLE :   [0-9]+ ('.' [0-9]+)? ;
WS : [ \t\r\n]+ -> skip ;
问题是,由于规则:
op=('-'|'+')expr
,我的语法接受像
2+++++3
这样的输入。但是,我没有找到实现有符号表达式的其他方法,例如
-2+3
x=6;y=-x
+3-2


如何修复该错误?

尝试打破语法,现在它有点像怪物规则(
expr
)。您可能不希望对整个表达式进行签名,而是对单个值进行签名。像这样的怎么样

expr: add value
    | expr mult expr
    | expr add expr
    | value
    ;
value: ID
     | DOUBLE
     | '(' expr ')'
     ;
add: '+' | '-';
mult: '*' | '/';
这样,您可以构建有符号表达式,如
-2
+x
-(2+3)
,但不能构建
2++3