我正在学习Antlr4
为基本算术编写语言。目前,我为基本算术运算符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 ;
问题在于,由于规则2++++3
,我的语法接受op=('-'|'+') expr
之类的输入。但是,我没有找到另一种方法来实现签名表达式,例如-2 + 3
,x = 6; y = -x
,+3 -2
。
如何修复错误?
答案 0 :(得分:1)
尝试分解你的语法,现在它有点像怪物规则(expr
)。您可能不希望签署整个表达式,而是签署单个值。这样的事情怎么样
expr: add value
| expr mult expr
| expr add expr
| value
;
value: ID
| DOUBLE
| '(' expr ')'
;
add: '+' | '-';
mult: '*' | '/';
这样,您可以构建签名的表达式,例如-2
,+x
或-(2+3)
,而不是2++3
。