我正在研究一个带有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
我得到这棵树:
如您所见,首先评估/操作数,并且正确的方法应该在左侧。
你可以帮我修改语法以获得正确的协议吗?
答案 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
会生成下面的解析树。
&#39;希望这有帮助。