2015-06-19 55 views
3

我使用升压精神的序列,例如BOOST SPIRIT解析 - 创建正确的AST树

t1 JOIN t2 JOIN t3 JOIN ... JOIN tn 

分析和结果应该是AST树与语义

((...((t1 JOIN t2) JOIN t3) JOIN ...) JOIN tn) 

我试图用规则如:

source = singleTable | (source >> JOIN >> singleTable); 

但是,根据Boost Spirit设计,解析过程仅使用规则a的第一部分nd仅解析表达式中的第一项(“t1”),并将剩余的序列解析为不连续(“JOIN t2 JOIN t3 JOIN ... JOIN tn”)。

哪个是解决这个问题的最好方法?

我可以重写喜欢

source = (singleTable >> JOIN >> source) | singleTable; 

但在这种情况下,规则的创建AST的样子

(t1 JOIN (t2 JOIN (t3 JOIN (... JOIN tn)...))). 

所以我需要补充处理步骤,以获得AST所需表格。

解析后是否有其他方法提供正确的AST?

回答

1

* Aside数据库引擎不会像这样盲目地创建它们的AST。更可能的是,他们可能会创建一个无序的行源列表((连接到)表/视图),并让查询优化器计算出如何优化计划执行。

除非您的实际AST的一个更好的例子,下面是更接近一个规则:

singleTable >> - ("JOIN" >> source) 
相关问题