【问题标题】:BOOST SPIRIT parsing - create correct AST treeBOOST SPIRIT 解析 - 创建正确的 AST 树
【发布时间】: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?

【问题讨论】:

    标签: c++ boost boost-spirit


    【解决方案1】:

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

    除非你的实际 AST 有更好的例子,这里有一个更接近的规则:

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

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      相关资源
      最近更新 更多