2012-07-06 72 views
1

我读的URL(和试图复制)和失败...(对ANTLR太大文章)...如何解决这个简单的ANTLR recusive问题

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)。

我相信这可能是一个简单的问题,像我一直盯着几个小时或一些东西的dang typo。 感谢, 院长

回答

1

我读的URL(和试图复制)和失败...(对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