具有基本算术和签名表达式的Antlr4语法

时间:2014-11-07 14:06:12

标签: java math compiler-construction antlr antlr4

我正在学习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 + 3x = 6; y = -x+3 -2

如何修复错误?

1 个答案:

答案 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