Antlr预测分析
我有一个用Antlr编写的类似SQL的语法,我在操作符中遇到了问题。示例查询/输入(在子句中没有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; 这里,表达式也是另一条规则,这非常复杂。它的层次相对较深。现在的问题是,当我的解析器达到这个规则
)如下所示
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。我刚刚使用了这种方法。你采取同样的方法增加了信心:)我试图验证,看看这是否解决了我的问题。顺便说一句,谢谢:)