我正在阅读网址(并尝试复制)并失败了......(关于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)。
我确信这可能是一个简单的问题,就像我一直盯着看几个小时或类似的错字。 谢谢, 迪安
答案 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中解析: