修改ANTLR中的语法以正确管理表达式

时间:2015-01-22 17:51:35

标签: expression antlr grammar

我正在研究一个带有ANTLR

的简单表达式求值程序

这是我创建的语法:

expression : relationExpr (cond_op expression)?  ;

relationExpr: addExpr (rel_op relationExpr)? ;

addExpr: multExpr (add_op addExpr)? ;

multExpr: unaryExpr (mult_op multExpr)? ;

unaryExpr: '-' value | '!' value | value ;

value: literal | '('expression')' ;

mult_op :  '*' | '/' | '%' ;

add_op : '+'|'-' ;

rel_op : '<' | '>' | '<=' | '>='| eq_op ;

eq_op : '==' | '!=' ;

cond_op : '&&' | '||' ;

literal : int_literal | char_literal | bool_literal ;

int_literal : NUM ;

char_literal : CHAR  ;

bool_literal : TRUE | FALSE  ;

我遇到的问题是操作数的关联不在左边。 例如,如果我评估:10+20*2/10

我得到这棵树:

enter image description here 如您所见,首先评估/操作数,并且正确的方法应该在左侧。

你可以帮我修改语法以获得正确的协议吗?

1 个答案:

答案 0 :(得分:1)

如果你真的不需要你的解析树节点是二进制操作,下面的语法会产生一个单独的multExpr节点,你可以从左到右走,我认为这是你的目标。

NUM : [0-9]+;

expression : relationExpr (cond_op relationExpr)* ;
relationExpr: addExpr (rel_op addExpr)* ;
addExpr: multExpr (add_op multExpr)* ;
multExpr: unaryExpr (mult_op unaryExpr)* ;
unaryExpr: '-' value | '!' value | value ;

value: literal | '('expression')' ;

mult_op :  '*' | '/' | '%' ;
add_op : '+'|'-' ;
rel_op : '<' | '>' | '<=' | '>='| eq_op ;
eq_op : '==' | '!=' ;
cond_op : '&&' | '||' ;

literal : int_literal ;
int_literal : NUM ;

解析示例表达式10+20*2/10<8会生成下面的解析树。

parse tree &#39;希望这有帮助。