含std::vector<self_type>成员的递归结构体适配BOOST_FUSION_ADAPT_STRUCT遇编译错误
解决Spirit X3递归AST的Fusion适配错误
错误原因
你错误地将Spirit X3的forward_ast用于AST结构体的成员类型中。forward_ast是解析器规则专用的延迟解析工具,并非为AST结构设计。Boost Fusion在适配你的node结构体时,无法识别forward_ast<node>这个类型的标签(tag_of),因此抛出编译错误。
修正方案
AST结构应使用标准的递归定义(通过前向声明解决类型依赖),forward_ast仅在解析器规则中用于处理递归规则的延迟解析:
1. 修正AST定义
#include <boost/spirit/home/x3.hpp> #include <boost/fusion/adapted/struct/adapt_struct.hpp> #include <vector> #include <string> namespace ast { struct node; // 前向声明,解决递归类型依赖 struct node { std::string name; double length; std::vector<node> children; // 直接使用node类型,移除forward_ast }; } BOOST_FUSION_ADAPT_STRUCT(ast::node, name, length, children)
2. 解析器规则中使用forward_ast
在定义递归解析规则时,用x3::forward_ast包装未完全定义的规则,实现延迟解析:
namespace parser { using namespace boost::spirit::x3; // 前向声明node规则 const rule<class node_rule, ast::node> node = "node"; // 定义node规则,递归部分用forward_ast包装 const auto node_def = lexeme[+alpha] // 匹配节点名(示例:字母开头的标识符) >> double_ // 匹配长度值 >> '(' >> -(x3::forward_ast(node) % ',') // 递归匹配子节点,用forward_ast处理未定义的规则 >> ')'; // 生成规则的实际定义 BOOST_SPIRIT_DEFINE(node); }
说明
- AST的递归结构只需通过前向声明即可实现,无需额外包装。
forward_ast的作用是告诉解析器:当前引用的规则尚未完全定义,延迟到后续解析,它仅用于解析器规则层面,而非AST数据结构。
内容的提问来源于stack exchange,提问作者WaterFox
相关产品推荐
相关产品推荐

