【发布时间】: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