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 树的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::spirit 解析任意精度整数

boost::spirit 解析器的编译错误

Boost Spirit编译问题

Boost.Spirit.X3 中的船长

使用 boost::spirit::x3 解析成向量<boost::string_view>

使用 boost-spirit 解析 ipv4 地址