在ANTLR中使用子表达式解析表达式

时间:2011-04-07 03:01:09

标签: antlr antlr3 antlrworks

我试图解析ANTLR中的递归表达式,例如:

(a + (b + C))

((a + b))

我读了这个假设的解决方案: ANTLR Grammar for expressions

然而,当我尝试创建一个规则,例如:

ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';

ANTLR抱怨“规则ParenthesisExpression是左递归的”。

如何解析本身可能具有相同形式的子表达式的表达式?

1 个答案:

答案 0 :(得分:4)

你可以这样做:

parse
  :  addExp EOF
  ;

addExp
  :  multExp (('+' | '-') multExp)*
  ;

multExp
  :  atom (('*' | '/') atom)*
  ;

atom
  :  ID
  |  '(' addExp ')'
  ;

ID    : 'a'..'z' | 'A'..'Z';

您越接近atom规则,优先级越高:+-的优先级最低,其次是*和{{1}最后,/ID具有最高优先级。


它解析输入:

( ... )

如下:

enter image description here


和输入:

((a / b)) - x

被解析为:

enter image description here