我正在阅读 URL(并试图复制)但失败了......(关于 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 或表达式(即第一个表达式可以使用或不使用括号)。
我确信这可能是一个简单的问题,比如我一直盯着几个小时之类的错字。