Я учу 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
.
Как я могу исправить ошибку?