有可能不允许自我递归吗?

时间:2018-04-18 00:59:30

标签: antlr antlr4

我有规则:

expression
   : //...
   | expression (relative_operator expression)+
   | //...
   ;

理想情况下,当我输入1=1=1时,它会生成expression(1, =, 1, =, 1)树。但是,实际上它会产生expression(1, =, expression(1, =, 1))。这是因为它更倾向于递归解析而不是一行解析。是否有可能明确告诉规则它既不能自行递归,也不应该在尝试递归之前服从+ / *

1 个答案:

答案 0 :(得分:3)

  

是否有可能明确地告诉规则它既不能自行递归,也不应该在尝试递归之前服从+ / *?

不,你必须像这样重写你的语法:

expr
 : add
 ;

add
 : mult ( ( '+' | '-' ) mult )*
 ;

mult
 : unary ( ( '*' | '/' ) unary )*
 ;

unary
 : '-'? atom
 ;

atom
 : '(' expr ')'
 | NUMBER
 | VARIABLE
 ;

会将1 + 2 + 3 * 4 * 5 / 6之类的输入解析为以下树:

enter image description here