BOOST SPIRIT解析 - 创建正确的AST树

时间:2015-06-19 16:12:07

标签: c++ boost boost-spirit

我必须使用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?

1 个答案:

答案 0 :(得分:1)

  

*除了数据库引擎不会盲目地创建这样的AST。更有可能的是,它们可能会创建一个无序的行源列表((连接到)表/视图),并让查询优化器找出如何以最佳方式规划执行。

除了更好的实际AST示例之外,这里的规则越来越接近:

 singleTable >> - ("JOIN" >> source)