BOOST SPIRIT 解析 - 创建正确的 AST 树
Posted
技术标签:
【中文标题】BOOST SPIRIT 解析 - 创建正确的 AST 树【英文标题】:BOOST SPIRIT parsing - create correct AST tree 【发布时间】:2015-06-19 16:12:06 【问题描述】:我必须使用 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】:*Aside 数据库引擎不会像那样盲目地创建它们的 AST。更有可能的是,他们可能会创建一个行源((连接到)表/视图)的无序列表,并让查询优化器计算出如何以最佳方式规划执行。
除非你的实际 AST 有更好的例子,这里有一个更接近的规则:
singleTable >> - ("JOIN" >> source)
【讨论】:
以上是关于BOOST SPIRIT 解析 - 创建正确的 AST 树的主要内容,如果未能解决你的问题,请参考以下文章