2012-07-06 50 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