antlr为嵌套布尔表达式留下了递归

时间:2013-05-09 18:53:06

标签: antlr grammar left-recursion

我正在编写一个antlr语法,我希望能够使用嵌套表达式,它可以是“简单”表达式或布尔表达式(带有可选括号)。一个简单的表达式只是一个带有lhs和rhs的表达式,例如a = 5

我希望能够支持这些类型的表达式:

a = 5
a = 5 OR b = 10
a = 5 OR (b = 10 AND c = 12)
(a = 5 AND b = 10) OR (c = 12 AND D = 13)

我的语法如下:

STRING: CHAR+;
fragment CHAR: ('a'..'z' | 'A'..'Z' | '0'..'9'); 

booleanOp: 'AND' | 'OR';
simpleExpr: STRING '=' STRING;
expr: simpleExpr | parenExpr | booleanExpr;
parenExpr: '(' expr ')';
booleanExpr: expr (booleanOp expr)+;

我收到错误exprbooleanExpr互相递归。我理解为什么正在发生,但如果我希望能够在彼此之间嵌套布尔表达式,我不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

在www.antlr.org的主页上,您可以看到此示例语法:

grammar Expr;
  prog: (expr NEWLINE)* ;
  expr: expr ('*'|'/') expr
  | expr ('+'|'-') expr
  | INT 
  | '(' expr ')' ;

进行一点编辑,这将是您所需要的。这是针对ANTLR 4.您使用的是哪个版本?我确信每个版本的ANTLR都有一个表达式语法样本。