如何解决这个简单的antlr recusive问题

时间:2012-07-06 21:56:34

标签: antlr antlr3

我正在阅读网址(并尝试复制)并失败了......(关于antlr的文章也很棒)......

https://supportweb.cs.bham.ac.uk/docs/tutorials/docsystem/build/tutorials/antlr/antlr.html

我添加括号之前的解决方案

whereClause: WHERE expression -> ^(WHERE_CLAUSE expression);
expression: orExpr;
orExpr: andExpr (OR^ andExpr)*;
andExpr: primaryExpr (AND^ primaryExpr)*;
primaryExpr: parameterExpr | inExpr | compExpr;

我的解决方案由于无限递归而失败(但我认为LPAREN ^和RPAREN!应该解决的问题???)....

whereClause: WHERE^ (expression | orExpr);
expression: LPAREN^ orExpr RPAREN!;
orExpr: andExpr (OR^ andExpr)*;
andExpr: primaryExpr (AND^ primaryExpr)*;
primaryExpr: parameterExpr | inExpr | compExpr | expression;

注意底部的primaryExpr已经添加了表达式,其上有LPAREN和RPAREN,但WHERE可以是orExpr或表达式(即第一个表达式可以使用或不使用parens)。

我确信这可能是一个简单的问题,就像我一直盯着看几个小时或类似的错字。 谢谢, 迪安

1 个答案:

答案 0 :(得分:1)

  

我正在阅读网址(并尝试复制)并失败了......(关于antlr的文章也很棒)......

请注意,本文解释了ANTLR v2,它的语法与v3有很大不同。最好在这里找一个像样的ANTLR v3教程:https://stackoverflow.com/questions/278480/antlr-tutorials

  

我的解决方案由于无限递归而失败(但我认为LPAREN ^和RPAREN!应该解决的问题???)....

如果那是WHILE之后的唯一表达,那就会有。但是,orExpr导致问题(如果删除它, 递归错误将消失)。

带括号的表达式通常具有最高优先级,因此应放在primaryExpr规则中,如下所示:

grammar T;

options {
  output=AST;
}

parse       : whereClause EOF!;
whereClause : WHERE^ expression;
expression  : orExpr;
orExpr      : andExpr (OR^ andExpr)*;
andExpr     : primaryExpr (AND^ primaryExpr)*;
primaryExpr : bool | NUMBER | '('! expression ')'!;
bool        : TRUE | FALSE;

TRUE        : 'true';
FALSE       : 'false';
WHERE       : 'where';
LPAREN      : '(';
RPAREN      : ')';
OR          : '||';
AND         : '&&';
NUMBER      : '0'..'9'+ ('.' '0'..'9'*)?;
SPACE       : (' ' | '\t' | '\r' | '\n')+ {skip();};

现在输入"where true || false""where (true || false)"都将在以下AST中解析:

enter image description here