问题标签 [boost-spirit-karma]
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.
boost-spirit-karma - 在 karma 中使用变体存储容器
结果是 r = false,使用 = ""。但是,我希望使用 =“测试”。
还有一个例子
结果还是r=false,用=””。然而。怎么了?
c++ - 如何在不提供有效生成器的情况下调用 boost::karma::rule 不使用其属性?
假设我们有以下源代码:
这无法编译,因为karma
缺少std::nullptr_t
(那些是boost::spirit::traits::extract_c_string
和boost::spirit::traits::char traits
)的一些特征。更具体地说,它失败了,因为karma
无法找到 type 属性的生成器std::nullptr_t
。
我看到了几种解决方法:
- 在语法定义中替换
std::nullptr_t
为karma::unused_type
:它适用于此示例,但可能会在更复杂的语法中引入歧义。 - 定义特征专业化:在我看来,这是肮脏的而不是通用的。另外,它暴露了我对每个人的标准类型的专业化,导致潜在的冲突。
- 专门化属性转换:专门为我专门化标准类型的问题。
- 编写自定义生成器:迄今为止最好的候选者,但与任务复杂性相比,它会产生大量高度模板化的代码行。
- 放置一个带有
karma::unused_type
属性的中间规则。一个有效但没有意义的快速修复。
问题:我如何告诉karma::rule
生成一个简单的文字而不关心它的属性是否有生成器?
c++ - 使用 boost karma 重用已解析的变量
我有一个代码库,它与下面的代码相当。我尝试生成一个具有两倍于变量内容的文本文件。我觉得答案在于语义操作以及 _a 和 _val 但即使有文档也无法解决。
你将如何在 str 和输出中拥有:“toto”:toto 一些东西 toto
即如何在业力中重用已解析的变量?
解决方案(根据下面的帖子:)
c++ - Boost Karma - 非消费谓词
我需要打印一个 std::complex 但如果它等于零则省略虚部。所以我有两个产品的规则:
这样,Karma 总是会选择第一个产生式,所以我需要某种谓词来做出决定。Boost Karma 教程附带了需要将 std::complex 改编为三元素元组的解决方案。
但不幸的是我不能这样做,因为其他代码正在使用 std::complex 改编为两个元素元组。有没有办法在不直接将谓词添加到 Fusion 适配器的情况下解决该问题?
我试图使用karma::eps 生成器作为谓词
但我不知道应该在 eps(...) 中放入什么 Phoenix 表达式,并且由于 Epsilon Generator 不消耗任何属性,我不确定是否可以从中访问 std::complex ?
c++ - boost::spirit::karma alternative selection based on properties of the input
I'm trying to write a boost::spirit::karma generator where some of the output depends on non-trivial properties of the input values.
The actual problem is part of a larger grammar, but this example has the same properties as several of the other troublesome rules and is actually one of the grammar rules that is causing me trouble.
I'll start with a minimal example that is almost what I want, and then work from there.
The above code defines a grammar that, when fed with the test data, produces the output
1.5, 0.0, -2.5, nan, inf
However, the output that I want is
1.5, 0.0, -2.5, special, special
If I replace the value
part of the grammar with
I get the desired behavior for infinity. However, I do not get the desired result for NaN since NaN has the property that (NaN != NaN) in comparisons. So I need a way to use the fpclassify macros/functions such as isfinite().
I should be able to get what I want by replacing the value
part of the grammar with
However, every combination of function calls, function pointers, and bind incantations that I've tried for the ...
part has resulted in compiler errors.
Any help would be much appreciated.
UPDATE:
Sehe provided an excellent general solution (which I have accepted). Thank you!
For my particular use case, I was able to further simplify sehe's answer and wanted to document that here for others.
After changing all of the includes from <boost/spirit/home/*>
to <boost/spirit/include/*>
and defining BOOST_SPIRIT_USE_PHOENIX_V3
before those includes, I added the following line
and changed the value
part of the grammar to this
boost - 如果布尔属性为真,则生成字符串(与 qi::matches 对应的业力)
想象一下,我们想用 Boost.Spirit 解析和生成简单的 C++ 成员函数声明。
Qi 语法可能如下所示:
这意味着,函数是否const
存储在bool
.
用Karma怎么写对应的生成器?
在这里,我们需要一个使用布尔属性的指令,如果属性是则执行嵌入式生成器,true
否则不执行任何操作。我们想要使以下测试成功的东西。
Boost.Spirit 中是否已经提供了这样的指令?
c++ - 变体的 C++ boost::spirit::karma 规则
我的程序中有一个接受, ,等boost::variant
类型的程序。我正在存储这些,我想用它来生成/打印它们。我是新手,但我知道它适用于变体。我有什么选择呢?生成其中一个的简单语法/规则是什么样的?任何帮助都会很棒!double
uint16_t
std::string
boost::karma
boost::spirit
c++ - boost karma - 从一个属性生成多个字符串
我正在使用一个消耗成对向量的业力发生器 - 类似于http://boost-spirit.com/home/articles/karma-examples/output-generation-from-a-list-of-key-value-pairs -使用精神业力/
我按照上面的文章构建了一个示例来显示我的问题
我想要实现的是像 "value1 key1 value1" 这样的输出。通常它会输出“key1 value1”(但前提是你在我的例子中删除了第三个 karma::string)我已经尝试了很多带有语义动作的东西,例如
但是,这不起作用。我可能需要其他东西来从我的 std::pair 中获取价值。
这两个问题看起来很有趣,但没有解决我的问题 重用解析变量与 boost karma 如何访问 boost::spirit::karma 中嵌套对象的数据?
c++ - 使用成员函数从结构集合中提升精神业力生成
我正在尝试使用 karma 从包含提供字符串的成员函数的结构向量生成逗号分隔的字符串列表。
虽然我可以使用 phoenix::bind 生成单个字符串输出,并且可以从字符串向量生成 csv 输出,但我正在努力结合这两种方法。
在下面的例子中,第一个规则工作正常,第二个不会编译(使用VS2013,boost 1.57),给出一个phoenix错误:“cannot convert from 'std::vector> *' to 'foo *'”,很清楚在这种情况下,适用于结构的单个实例的语义操作是不正确的。是使用融合适配器的唯一答案吗?
c++ - 一条规则使用 BOOST_FUSION_ADAPT_STRUCT 时的精神业力语法问题
我正在尝试创建一个由多个规则组成的 Spirit Karma 语法。该语法旨在创建格式为“(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)”的字符串。打印出我称为 RowData 的每个单独结构的规则使用 BOOST_FUSION_ADAPT_STRUCT 打印出该结构的所有字段。如果语法仅包含该规则,则语法可以正常工作。但是,我使用这个结构作为 std::map 的值。整数中的键,但我不关心该值并想删除它。我创建了解析 std::map 的规则,但处理 std::pair 的规则无法为 BOOST_SPIRIT_ASSERT_MATCH 编译。我创建了一小段代码来产生这个问题。这条线是pairRule = bs::karma::omit << rowDataRule;
如果有人知道问题是什么或者我可以如何以不同的方式做到这一点,我将不胜感激。
编辑:我在 OpenSUSE 13.2 上使用 gcc 4.8.3,但在 Ubuntu 14.04 LTS 上使用 gcc 4.8.2 时遇到相同的错误。
主文件
错误信息: