You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:15:41