如何在带有 Boost Spirit 的 AST 中使用只有一个属性的类?

2024-03-26

我想使用 Boost Spirit 将文件解析为 AST。

我的 AST 的根源是一个只有一个属性的类:

typedef boost::variant<FunctionDeclaration, GlobalVariableDeclaration> FirstLevelBlock;

struct Program {
    std::vector<FirstLevelBlock> blocks;
};

BOOST_FUSION_ADAPT_STRUCT(
    ::Program,
    (std::vector<eddic::FirstLevelBlock>, blocks)
)

如果我使用单个规则进行解析:

program %= *(function | globalDeclaration);

它无法编译,但如果我将单个字符串名称添加到 Program 中,它就可以正常工作。我可以使用向量作为根,但我想使用该类,因为我想向 Program 类添加一些方法。

EDIT :

如果我用大括号括住我的程序,它会很好地工作:

program %= lexer.left_brace >> *(function | globalDeclaration) >> lexer.right_brace;

编译并工作正常,但是:

program %= *(function | globalDeclaration);

不编译...

Boost Spirit 中有什么东西可以阻止使用如此简单的规则吗?


编辑的问题版本2 https://stackoverflow.com/revisions/7947180/2

如果我用大括号括住我的程序,它会很好地工作[...],但是program %= *(function | globalDeclaration);不编译...

Boost Spirit 中有什么东西可以阻止使用如此简单的规则吗?

首先,如果没有定义,我们就无法真正判断function and globalDeclaration.

其次,我尝试将我的 PoC 线路更改为

static const qi::rule<It, Program(), space_type> program  = *(function | global);
Program d = test("void test(); int abc; int xyz; void last();" , program); 

你瞧,我得到了你的编译器错误!现在我当然同意这看起来非常就像属性转换错误一样。另外,这是一个初步的解决方法:

program %= eps >> *(function | global);

如你看到的,qi::eps来救援


回答原来的问题版本1 https://stackoverflow.com/revisions/7947180/1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在带有 Boost Spirit 的 AST 中使用只有一个属性的类? 的相关文章

随机推荐

  • 如何在 Visual Studio Code 中显示函数的使用?

    我使用 Pycharm 时可以按 ctrl 单击函数定义并查看用途 VSC 中有类似的吗 You can use Find All References Shift F12 to get a better view of usage htt
  • 用连字符替换所有非字母和数字的字符[重复]

    这个问题在这里已经有答案了 我面临着 URL 的问题 我希望能够转换可以包含任何内容的标题 并去掉所有特殊字符 这样它们只有字母和数字 当然我想用连字符替换空格 这将如何完成 我听说过很多关于正则表达式 regex 的使用 这应该可以满足您
  • R - 绘制缺少 NA 值的线

    我有以下 data frame 子集 Time A B C 2016 10 07 06 16 46 NA NA 41 2016 10 07 06 26 27 40 39 42 2016 10 07 06 38 23 NA 40 NA 201
  • 为什么 Django 为代理模型创建迁移文件?

    我刚刚创建了一个代理模型 https docs djangoproject com en 1 9 topics db models proxy models并惊讶地发现manage py makemigrations创建一个新的迁移文件mi
  • 问:在场景滚动时禁用“放大/缩小”

    我们使用基于 Roomle Web SDK 的基础存储库 Roomle UI 我们目前正在对此进行定制并将其相应地集成到我们的网站中 我们想通过滚动禁用自动 放大 它会中断预期的用户流程 不幸的是 我们还没有找到一种方法来实现这一点 而不保
  • c++11 中的 库可移植吗?

    c 11 中的库可移植吗 我避免使用 rand 因为我听说它不可移植 你如何定义 便携 如果 便携式 的意思是 在给定相同输入的情况下将产生二进制相同的随机数序列 那么是的 rand不便携 是的 C 随机生成器 http en cppref
  • Matlab 将文件从 Windows 资源管理器拖放到图形 (gui)

    我想知道有一种方法可以从 Windows 资源管理器中拖动文件并将其放入我的 GUI 中 目标应该是获取文件路径 或文件夹路径 并能够使用我自己的加载函数加载它 我准确地说 我在 Windows 10 64 位中使用 Matlab 2015
  • 如何使用 Javascript 禁用功能键?

    我有一个页面 我需要禁用功能键 主要是 F12 开发工具 我在页面中显示了一些敏感数据 因此无论如何我都无法让用户看到 html 并获取隐藏字段 我检查了一些 javascript 它适用于除了 f1 f12 等功能键之外的几乎所有键 无论
  • SQL Server,无法在主键字段中插入空值?

    我已经准备好在这件事上抓狂了 我对 MS SQL 还很陌生 还没有在任何地方看到过类似的帖子 当我尝试做这样的声明时 INSERT INTO qcRawMatTestCharacteristic VALUES NULL 1 1 1 1 1
  • Neo4j https 通信

    有没有办法只允许 https 而不是 http 与 Neo4j 服务器通信 另外 Neo4j Shell 的通信使用哪个通道 http 还是 https 这是来自 Neo4j 文档 HTTPS 支持 http docs neo4j org
  • Python 的按位求补运算符 (~ 波形符) 是如何工作的?

    为什么 2等于 3 如何 操作员工作 请记住 负数存储为二进制补码的正对应物 作为示例 以下是 2 的二进制补码表示形式 8 位 1111 1110 获得此值的方法是采用数字的二进制表示形式 取其补码 反转所有位 并加一 两个以 0000
  • 有条件地将键值对包含在哈希中[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有人可以帮我缩短以下方法吗 我从这个开始 我很喜欢 def self some hash foo gt bar end 现在我想添加一个可选键 我能想
  • 无法重新加载 nginx.service:需要交互式身份验证

    我正在使用 symfony 3 进行项目 项目运行在nginx服务器上 我正在尝试使用以下命令重新加载配置文件 从控制器 systemctl reload nginx Route testReloadConfig public functi
  • 如何枚举 USB 设备*并*对其进行读/写?

    我需要与一个自定义 USB 设备进行通信 它没有特定的驱动程序 该设备不显示为 dev tty I 发现 http www signal11 us oss udev 我该如何使用libudev枚举 USB 设备 假设我设法获得相应的stru
  • Java 中的克隆

    我在网上读到一段关于克隆的内容 但我不太明白 所以有人能解释清楚吗 如果类具有 Final 字段 则无法在克隆方法中为这些字段赋予值 这会导致正确初始化对象的最终字段出现问题 如果最终字段引用对象的某些内部状态 则克隆的对象最终会共享内部状
  • 恢复分页库 3 中的滚动位置

    我将 Paging Library 3 与 RemoteMediator 一起使用 其中包括从网络和本地 Room 数据库加载数据 每次我滚动到 RecyclerView 中的某个位置 导航到另一个片段 然后导航回带有列表的片段时 滚动状态
  • LibGDX 。绘制多行文本

    我正在尝试使用 libGDX 中的 BitmapFont 编写大文本 但它显示在一行上 用户只能看到文本的第一部分 如何使 bitmapFont 自动换行并在屏幕上显示整个文本 要么使用 n用于手动换行并通过渲染字体font drawMul
  • Node 和 Express:如何实现基本的 webhook 服务器

    我很难找到教程 我是 webhooks 的新手 除了对它们应该如何工作的一些基本描述之外 还没有使用或见过它们 我们的用例是在有新记录时更新 API 的用户 由于我们使用 Kafka 并已确定 最终一致性 因此另一个用途可能是在无法从 Ka
  • ListView 行标记 ala GMail

    我有兴趣创建一个 ListView 其中每一行都按照 GMail 3 0 中的方式进行标记 这会很好地分离左右 ListFragment 其他示例还包括 2 3 4 上的 Google 日历 例如颜色标记位于 ListView 的左侧 请参
  • 如何在带有 Boost Spirit 的 AST 中使用只有一个属性的类?

    我想使用 Boost Spirit 将文件解析为 AST 我的 AST 的根源是一个只有一个属性的类 typedef boost variant