Java 具有基本算术和符号表达式的Antlr4语法
我正在学习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
*
+
-
/
编写了一个语法。
这是我的语法:
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