我必须使用Boost Spirit解析类似
的序列t1 JOIN t2 JOIN t3 JOIN ... JOIN tn
,结果应该是带有语义的AST树
((...((t1 JOIN t2) JOIN t3) JOIN ...) JOIN tn)
我尝试使用如下规则:
source = singleTable | (source >> JOIN >> singleTable);
但是,根据Boost Spirit设计,解析过程仅使用规则的第一部分,仅解析表达式中的第一个项目(“t1”),并将未解析的序列的其余部分解析(“JOIN t2 JOIN t3 JOIN” ......加入tn“)。
解决此问题的最佳方法是什么?
我可以重写像
这样的规则source = (singleTable >> JOIN >> source) | singleTable;
但在这种情况下,创建的AST看起来像
(t1 JOIN (t2 JOIN (t3 JOIN (... JOIN tn)...))).
所以我需要一个补充处理步骤来使AST达到所需的形式。
解析后是否有其他方法提供正确的AST?
答案 0 :(得分:1)
*除了数据库引擎不会盲目地创建这样的AST。更有可能的是,它们可能会创建一个无序的行源列表((连接到)表/视图),并让查询优化器找出如何以最佳方式规划执行。
除了更好的实际AST示例之外,这里的规则越来越接近:
singleTable >> - ("JOIN" >> source)