问题标签 [boost-spirit-x3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
181 浏览

boost-spirit-x3 - 使用spirit x3解析长度相关的数据结构

我正在尝试使用 Spirit x3 解析二进制数据,但遇到了一个问题,我找不到解析长度相关数据结构的方法,例如 [uint32-counter][counter-length data]。

是否可以将属性从一个解析器 (x3::little_dword) 传递给 x3::repeat(???)[byte_] 之类的东西?

0 投票
1 回答
163 浏览

c++ - How to do no_case in Spirit x3

I have a problem that IDK how to do no_case in spirit X3. There is no_case in Spirit, but when I use it I get:

It is possible I am confused and I am trying to mix apples and oranges (qi and x3, for example IDK the difference between x3::parse and qi::parse)

So tl;dr my question is how to make this work:

(without no_case it works)

0 投票
2 回答
135 浏览

c++ - 如何允许良好的空间并以增强的精神禁止不良空间

激励例子
很好:

坏的:

因此,正如您在这里看到的问题是,有些空格是可以的(例如,在 SELECT 和 a、b、c 之间),有些是不好的(SE L ECT),有些是必需的(关键字之后/之前)。

所以我的问题是在这里使用什么成语,因为如果我使用spaceskipperphrase_parse将允许错误的空间,如果我想允许没有船长的好空间,解析器会变得乱七八糟*char_(' ')

0 投票
2 回答
304 浏览

c++ - 依赖于参数的解析器规则

我试图定义一个规则没有完全预定义的解析器,即它们包含一个可变部分。这对灵气没有问题,但由于X3的静态特性,我无法实现。我尝试了with 指令,不幸的是没有记录,但到目前为止还没有运气。到目前为止,我发现的唯一示例是在 lambda 表达式中。

我构建了一个简单的例子来演示这个问题:解析整数,其中分隔符作为参数给出。

我注释掉了我尝试使用with 指令的部分。

X3目前可以做到这一点吗?有没有人这样做过?

0 投票
1 回答
290 浏览

c++ - Boost Spirit X3:将数据提取到 x3::variant<...> 始终为空

我想将一些输入解析为 along或 anstd::string如果它被引用。对此的合理解决方案是用于x3::variant<long, std::string>存储数据。这是一个示例程序:

我的预期结果是:

但是,实际结果很简单:

我究竟做错了什么?升压版本是 1.61。

0 投票
2 回答
774 浏览

c++ - 使用 boost spirit x3 单独解析器时链接错误

我正在尝试使用 将我的 boost spirit x3 解析器分成不同的 _def 和 .cpp 文件BOOST_SPIRIT_DEFINE/DECLARE/INSTANTIATE,但我不断收到链接错误。 是我的解析器,它是分开的。

链接器错误读取

我究竟做错了什么?我怎样才能使我的例子工作?

  • 配置.hpp:

    /li>
  • 文字.cpp:

    /li>
  • 文字定义.hpp:

    /li>
  • 文字.hpp:

    /li>
  • 主.cpp:

    /li>
0 投票
0 回答
84 浏览

c++ - 语义动作似乎破坏了属性兼容性

似乎添加语义操作会破坏属性兼容性。以下简单示例按预期工作和编译:

pair_rule现在,当我向in添加语义操作时combined

编译器抱怨移动不兼容的类型

alnum但是,当向 中的一个解析器添加另一个语义操作时pair_rule,代码会再次编译:

为什么语义动作会破坏属性兼容性,附加语义动作如何“修复”它?

0 投票
1 回答
274 浏览

c++ - Boost Spirit x3 解析器在解析时抛出 std::logic_error

我使用 boost spirit x3 创建了一个语法。在测试生成的解析器时,我认识到存在解析器抛出以下异常的情况:

我不知道使用 boost spirit x3 会发生这种情况,我认为 parse 方法八重返回 false 或抛出 a boost::spirit::x3::expectation_failure,我在语法上做错了什么,因为这不应该在这里发生。我在这里上传了我的 mcve 如果您执行二进制文件,则会抛出 std::logic 错误。

  • 例子.cpp

    /li>
  • 主文件

    /li>
  • 类型.cpp

    /li>
  • ast.hpp

    /li>
  • 配置文件

    /li>
  • example_def.hpp

    /li>
  • 例子.hpp

    /li>
  • types_def.hpp

    /li>
  • 类型.hpp

    /li>
0 投票
1 回答
203 浏览

c++ - 在类中封装 Spirit X3 解析器

我试图将 X3 解析器封装在一个类中,其中规则(及其定义)是成员,即类似于 Qi 解析器的结构,其中必须从 boost::spirit::qi::grammar 派生。

这种方法的优点是什么:

  • 比示例中使用的命名空间方法更好地分离代码(例如,避免命名空间冲突)
  • 解析器仅在生成此类的对象时才被实例化,而不是解析器(各个规则)是静态的
  • 潜在参数(例如依赖于参数的问题解析器规则)可能会被提供给构造函数并以“直接”方式集成,而不是使用with<> 指令

但这似乎不可能。在表单中定义规则(或者更确切地说是规则定义)auto name = rule<class name, std::string>() = alpha >> *alnum;不是一个选项,因为auto对于类成员来说是不可能的。另一方面,除了非常小的解析器之外,说明实际类型似乎也不实用。一种建模替代方法是将规则作为成员并在构造函数中创建定义,但在这里它们之间的链接通常使用 BOOST_SPIRIT_DEFINE 完成,是不可能的,并且仅靠规则不足以解析(static_assert failed "BOOST_SPIRIT_DEFINE undefined for这条规则。”)。

此外,将整个解析器放在一个类方法中,例如ParseXYZ::parse(),它创建解析器 - 可能通过另一种方法,这样它只创建一次 - 并解析输入,在代码重用方面并不是一个真正的选择(除了复制和粘贴)。

您知道是否可以将 X3 解析器封装在一个类中?除此之外,您对在 X3 中构建可重用解析器有何建议?

0 投票
0 回答
358 浏览

c++ - Boost Spirit X3:“属性没有预期的大小”,但它为什么在乎?

我正在尝试使用 Spirit X3 编写解析器,但我还没有走得很远,因为我遇到了一个我无法弄清楚的编译错误。我想我知道编译器在抱怨什么,但我不明白为什么它在乎。以下代码编译(clang 3.9,Boost 1.62.0)并工作。(我意识到它的结构很差,并且有内置的常量解析器;我只是想证明这个问题。)

但是,如果我将 constant_def 更改为使用 float_literal 而不是 integer_literal:

我开始遇到编译错误。

查看源代码,我看到一条消息:

我认为该错误与 float_literal 的定义中存在可选项有关。我相信 of 的属性类型integer_literal类似于vector<char>,但可选导致的属性float_literal类似于tuple<vector<char>, optional<vector<char>>>? 在某个地方,我试图将其强制为字符串或其他东西,但它失败了,因为它试图将 2 元组转换为 1 元组。我怀疑解决方案是将float_literal定义包装起来,raw[]以便我得到底层字符串,这是我想要的。但由于这是我的第一个 X3 解析器,我想了解编译器为什么会引发此错误,以便我可以诊断它是否出现在另一个上下文中。

我真正不明白的是为什么编译器关心float_literal. 我附加了一个语义动作,它生成了一个 Constant 的实例,它是常量规则的属性类型,没有任何对属性的引用float_literal,那么为什么编译器会关心的属性float_literal呢?它在哪里尝试进行不等长序列分配,目的是什么?

谢谢!