Antlr预测分析

Antlr预测分析,antlr,antlrworks,Antlr,Antlrworks,我有一个用Antlr编写的类似SQL的语法,我在操作符中遇到了问题。示例查询/输入(在子句中没有)如下所示 select sum(sum(sum.........N)) from table where sum(sum(sum....N)) = 10 这是语法规则中的 inOperator: expression IN (valueList | query) | expression; 这里,表达式也是另一条规则,这非常复杂。它的层次相对较深。现在的问题是,当我的解析器达到这个规则

我有一个用Antlr编写的类似SQL的语法,我在操作符中遇到了问题。示例查询/输入(在子句中没有
)如下所示

select sum(sum(sum.........N)) from table where sum(sum(sum....N)) = 10
这是
语法规则中的

inOperator:
expression IN (valueList | query)
    |  expression;
这里,
表达式
也是另一条规则,这非常复杂。它的层次相对较深。现在的问题是,当我的解析器达到这个规则时,它会深入堆栈,将每个标记匹配到第一个规则的
表达式
部分;在查询结束时,它得到了这个运算符中没有的结果,所以第二条规则应该匹配

根据一般解析规则,每个查询标记都会发生这种情况,这是无用的


我有什么方法可以跳过这些预测循环,轻松获得第二条规则?一般来说,第一条规则的查询模式很少出现,正因为如此,我们的整个结构正在放缓。作为参考,我使用的是Antlr 1.4.3。

左因子分解应该会有所帮助。尝试:

inOperator:
  expression inSuffix? ;

inSuffix:
  IN (valueList | query);

这将只解析表达式一次,并在出现时附加inSuffix。

我想您是指ANTLRWorks 1.4.3?这与ANTLR 3或ANTLR 2匹配吗?是的,它是ANTLRWorks 1.4.3。Antlr版本是3.1.3。我刚刚使用了这种方法。你采取同样的方法增加了信心:)我试图验证,看看这是否解决了我的问题。顺便说一句,谢谢:)