问题标签 [boost-spirit-qi]
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.
c++ - Spirit::qi : 将继承的属性引用传递给 phoenix::function
以下代码是我正在尝试做的简化版本。基本上,我有一个带有容器数据成员的结构(玩具代码中的 int_holder)。我想插入一个对象(在这种情况下为 int)并向父 qi::rule 返回一个指向新插入对象的指针。
我通过引用将 int_holder 传递给语法,以便在解析时用值填充它,因此 int_holder 将是语法的继承属性。代码:
该代码无法编译,并显示以下错误消息:
将_r1传递给phoenix::function时显然有问题,但我不知道如何解决。提前致谢。
c++ - 使用 Boost Spirit 的流解析器和自定义语法
概要
我想利用 Boost Spirit 的流解析器 API来std::istream
增量解析。但是,我找不到一个很好的例子来说明如何将它与基于迭代器的语法一起使用。从概念上讲,我的目标是解析无限类型的对象流T
。
细节
T
具有 type和 skipper属性的 Qi 语法S
通常具有以下形式:
如何在基于流的 API 中使用这样的语法?具体来说,我对流 API 的心智模型是我可以按照以下方式做一些事情:
我正在努力整合需要迭代器的传统语法。它如何与流 API 配合使用?
c++ - boost::spirit::qi 期望解析器和解析器分组意外行为
我希望有人可以通过我在精神解析中使用>
and运算符的无知来照亮。>>
我有一个有效的语法,顶级规则看起来像
它依赖于属性将解析值自动分配给融合适应的结构(即提升元组)。
但是,我知道一旦我们匹配了 operationRule,我们必须继续或失败(即我们不想让回溯尝试其他以 开头的规则identifier
)。
这会导致一个神秘的编译器错误 ( 'boost::Container' : use of class template requires template argument list
)。Futz 绕了一下,编译如下:
但属性设置不再起作用 - 我的数据结构在解析后包含垃圾。这可以通过添加类似的动作来解决[at_c<0>(_val) = _1]
,但这似乎有点笨拙 - 以及根据 boost 文档使事情变慢。
所以,我的问题是
- 是否值得防止回溯?
- 为什么需要分组运算符
()
- 我上面的最后一个示例是否真的在匹配后停止回溯
operationRule
(我怀疑不是,似乎如果(...)
失败回溯中的整个解析器将被允许)? - 如果上一个问题的答案是/no/,我该如何构造一个规则,如果
operation
/not/匹配则允许回溯,但一旦操作/is/匹配则不允许回溯? - 为什么分组运算符会破坏属性语法 - 需要操作?
我意识到这是一个相当广泛的问题 - 任何指向正确方向的提示都将不胜感激!
c++ - 如何使用 boost::spirit 将单词序列解析为向量?
我正在努力学习boost::spirit
。例如,我正在尝试将一系列单词解析为vector<string>
. 我试过这个:
这给了我这个输出:
但我想要以下输出,其中每个单词都单独匹配:
如果可能的话,我想避免qi::grammar
为这个简单的案例定义我自己的子类。
c++ - 如何在 boost::spirit 语义动作中将函数对象的结果分配给本地
我不太确定为什么以下代码在 GCC 4.6.3 中给我以下错误
'boost::spirit::_a = boost::phoenix::function::operator()(const A0&) const [with A0 = boost::phoenix::actor >, F = make_line_impl 中的 'operator=' 不匹配, 类型名 boost::phoenix::as_composite, F, A0>::type = boost::phoenix::composite, boost::fusion::vector, boost::spirit::argument<0>, boost::fusion: :void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_ , boost::fusion::void_>]((* & boost::spirit::_1))'</p>
甚至可以将惰性函数对象的结果分配给 qi 占位符吗?
c++ - 如何使用 boost::spirit 将文本解析为结构?
我正在学习boost::spirit
,我正在尝试阅读一些文本并将其解析为结构。
例如,在我的下面"2: 4.6"
被解析为 int2
和 double :4.6
TestStruct
它工作得很好,但我想知道如何简化这段代码?
例如,我想摆脱mystruct0
语法规则,该规则仅用于标记类型std::pair<int,double>
,然后用于从规则中自动构造TestStruct
对象。mystruct
如果可能的话,我还希望能够摆脱TestStruct
构造函数std::pair
。
那么,下面的代码可以以某种方式进行编译吗?那将是一个更好的解决方案:
不幸的是,编译器说:
c++ - 如何在不跳过 eol 的情况下使用船长 ascii::space?
我必须使用 boost::spirit 进行解析,并且我想使用 phrase_parse 函数:
但是我的编译器不允许第四项(ascii::space - qi::eol)。如何在不跳过 eol 的情况下使用船长 ascii::space ?
c++ - 如何解析后跟分号或换行符(boost::spirit)的条目?
在 Boost::Spirit 中,如何解析后跟分号或带有可选分号的换行符的条目?
示例输入,其中每个条目是一个 int 和一个 double:
这是仅解析后跟空格的条目的示例代码:
现在,为了解析我想要的方式(每个条目后跟分号或带有可选分号的换行符),我替换了这个:
这样:
其中boost::spirit
运算符||
表示:(a 后跟可选 b)或 b。1.4
但是,如果在此示例输入之后有空格,则会出现错误:
空间不匹配是有道理的,no_skip
但我无法找到解决方案。
c++ - 如何在 boost::spirit 规则中使用 boost::tuple 作为属性?
我有以下规则boost::spirit
:
但是第二个int
没有写入元组。有没有办法让它工作而不必使用boost::fusion::tuple
?
如果我使用它可以工作std::pair
,那为什么我不能使用boost::tuple
?
这是一个完整的编译示例:
c++ - 如何从 Boost Spirit 中的函数中抛出一个expectation_failure?
在 Boost::Spirit 中,如何expectation_failure
从绑定的函数中触发Boost::Bind
?
背景:我解析了一个包含复杂条目的大文件。当一个条目与以前的条目不一致时,我想失败并抛出一个expectation_failure
(包含正确的解析位置信息)。当我解析一个条目时,我绑定了一个函数,该函数决定该条目是否与之前看到的内容不一致。
我编了一个小玩具例子来说明这一点。在这里,我只想在不能被 10 整除expectation_failure
时抛出一个:int
抛出 anexpectation_failure
意味着我在不能被 10 整除的 int 上收到这样的错误消息: