问题标签 [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.

0 投票
1 回答
291 浏览

c++ - 将属性转换为 boost::variant

在学习如何使用 boost spirit、phoenix 和 fusion 库时,我遇到了这个无法在 msvc(2015,版本 14)和 boost 1.61.0 上编译的最小示例

然后我收到以下错误消息:

错误 C2665:'boost::detail::variant::make_initializer_node::apply::initializer_node::initialize':5 个重载中没有一个可以转换所有参数类型

尽管我无法理解答案如何解决该问题以及这是否真的与似乎正确提供了所有类型的问题相同(不需要类型转换),但此处报告了一个类似的问题。

0 投票
1 回答
175 浏览

c++ - 具有运行时错误的业力生成器的调试技术

很难说出我的编程问题是什么,因为我真的不知道问题出在哪里。事实上,我在 boost 精神业力库的某个地方丢失了一个运行时错误。我想我在这里错过了一种调试技术。

我已经看到宏BOOST_SPIRIT_DEBUG_NODE(S)对解析器有很大帮助,尽管我在手册中找不到任何对它的引用。对于生成器,这似乎不起作用,我(老实说)没有勇气(我应该吗?)深入研究这个库的代码以了解问题出在哪里。

我试图在没有任何问题的情况下单独在语法中生成三种类型的联合结构。所以我假设错误来自将 U 结构转换为 boost 变体,再次(参见Casting attribute to boost::variant)但我没有证据。

对于那些可以通过简单的代码检查来解决它的人,这是我的问题的最小示例:

更新:编译器:Visual C++ Express 版本 11 和 12。调用堆栈停止在:

我还发现_SCL_SECURE_NO_WARNINGS宏的定义掩盖了以下编译器警告:

警告 C4996:'std::_Copy_impl':带有可能不安全参数的函数调用 - 此调用依赖于调用者检查传递的值是否正确。要禁用此警告,请使用 -D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用 Visual C++ 'Checked Iterators' 的文档

此警告涉及几个 boost-spirit 文件:

  • spirit\home\karma\detail\output_iterator.hpp(242)
    spirit\home\karma\detail\output_iterator.hpp(577) 
    spirit\home\karma\detail\output_iterator.hpp(574) 
    spirit\home\karma\detail\ Alternative_function.hpp(170)
    spirit\home\karma\detail\alternative_function.hpp(162) 
    spirit\home\karma\operator\alternative.hpp(122)
    spirit\home\karma\auxiliary\attr_cast.hpp(85)
    spirit\ home\karma\nonterminal\detail\generator_binder.hpp(43)
    spirit\home\karma\nonterminal\detail\generator_binder.hpp(52)
    spirit\home\karma\nonterminal\rule.hpp(193)
    spirit\home\karma\非终端\rule.hpp(230)
0 投票
2 回答
100 浏览

c++ - 如何在其前面的符号映射值中显示与字符一样多的空格

老实说,我放弃(像我之前的许多其他人一样)自己找到这个仍然非常简单的 boost-spirit-karma 库生成器的语法。我想在字符串之前显示与字符串中的字符一样多的空格:

因此,预期的输出是一个空格,后跟“A”,下一行是 5 个空格,后跟“B”(因为“B”是 5 个字符的字符串)。

我知道在ka::repeat()[]生成器的参数的上下文中可能无法访问变量“b”......我尝试ka::_val了但没有成功。实际上,我在业力、凤凰和融合方面都没有足够的经验来构建通往答案的道路,尽管我可能可以访问文档中所有需要的信息。因此,我也希望能得到一些提示,告诉我如何仅通过文档(或通过推论)而不是通过经验得出答案。

更新:

我尝试使用属性转换但没有成功:

其次是:

但它也没有编译。

0 投票
1 回答
371 浏览

c++ - 灵气语法可以重用为灵业语法吗?

我有一个 Qi 语法定义,用于解析输入。后来我有一个 Karma 生成器,它以类似于输入的方式输出。

这可能吗?似乎解析器语法可以自动转换为生成器语法(??)。

0 投票
1 回答
416 浏览

c++ - boost::spirit::karma 语法:带有可选属性的结构的逗号分隔输出

我需要一个带有选项的结构的逗号分隔输出。例如,如果我有这个结构:

类似的输出:{ "string", 1, 3.0 } or { "string" } or { 1, 3.0 }等等。

现在,我有这样的代码:

这可行,但我需要一个逗号分隔的输出。我尝试使用如下语法:

但我收到此编译错误:

谢谢!

0 投票
1 回答
56 浏览

boost - 提升业力中不一致的生成器指令列行为

我正在编写一个业力生成器来生成一个 HTML 页面,并且在使用列指令时遇到了不一致的行为。这很可能是我对其工作原理的理解。

基本上我正在生成一个网格,它要求我在每出现 2 次数据后插入一些分隔符。

以下是我用来进行试运行的基本程序。

以上生成以下输出:

如前所述,第 n 个分隔符出现在每一代之后,而不是每一秒之后。

预期的输出是

0 投票
1 回答
94 浏览

boost - 在增强精神中将分隔符传递给子规则

这是我在这里提到的问题的延续

提升业力中不一致的生成器指令列行为

我想将该规则包装到另一个规则中,这样做时,将列指令传递给子规则,但我无法弄清楚这样做的正确方法是什么。

这是下面的代码

在行

我想通过

分隔符,以便将列分隔符应用于small_box rule.

所以预期的输出变成

最终因为会有一个向量将另一个自定义分隔符传递给big_box规则。

背景

我打算编写一个诊断接口作为学习各种 C++ 概念的练习,其中涉及以下内容。

1.从 IDL 文件中解析数据。我还没有定义确切的格式,但看起来与此类似

  1. 从 IDL 文件生成 HTML 元素。每个结构都包装在一个盒子中,该盒子包含它们内部的各个元素,这些元素包含在带有图标/可选部分的较小盒子中。第 n 个分隔符对于生成引导网格以将这些框放置在屏幕上很有用。

  2. 使用 websocket 实现完成 HTML 页面,该实现会在收到包含 DOM 元素名称-值对的 JSON 数据时自动更新 DOM 元素。类似地,对于每个输入,执行一个发送命令以将其包装在 JSON 中并发送到 Web 服务器。

  3. 为网络服务器自动生成代码,以便唯一需要实现的代码是从外部源接收/传输数据,并生成所有与 JSON 的转换。

以下用例提示我寻找解析器/生成器解决方案。

0 投票
1 回答
184 浏览

c++ - Boost Karma:使用 boost::optional 编写规则>

我正在尝试在 Karma 生成器中使用 a boost::variantwithin a boost::optional。我已经能够将问题简化为:

这里的输出是:

不是我所希望的。

我改变的第一件事就是或多或少地通过更改FooVariant为进行健全性检查:using FooVariant = int;. 这输出:

并且是我想看到的!所以在我的第一个代码中,变体只有一种类型,所以我尝试添加第二种类型,只是为了看看:

但随后我们回到:

然后我尝试为该变体添加一个专门的规则:

这给出了编译错误:

看起来模板生成正在尝试确保boost::variantandboost::optional兼容,但对我来说,问题是“为什么要确保它们完全兼容?”

我怎样才能使这项工作?

0 投票
1 回答
137 浏览

boost - BOOST_FUSION_ADAPT_ADT 与 boost::karma 一起使用时会爆炸

我不确定这是否与使用 BOOST_FUSION_ADAPT_ADT 适应类时出现错误有关,但即使是这样,其背后的问题仍然没有得到回答/仍然失败,请参阅作者在使用 BOOST_FUSION_ADAPT_ADT 适应类时出错的评论。(我使用了 boost 1.69)

我有一个结构

我可以使用boost::spirit::qivia

但由于我现在还想生成而不只是解析它的结构,所以我必须使用 boost::spirit::karma

但它会出现几个错误,从模板错误到语法错误,例如

在 /Users/markus/Entwicklung/HTW/RTSP-Streaming/src/streaming_lib/include/rtsp_request.hpp:11 包含的文件中: 在 /Users/markus/include/boost/spirit/include/qi.hpp 包含的文件中: 16:在 /Users/markus/include/boost/spirit/home/qi.hpp:14 包含的文件中:在 /Users/markus/include/boost/spirit/home/qi/action.hpp:14 包含的文件中:在 /Users/markus/include/boost/spirit/home/qi/action/action.hpp:16 包含的文件中:/Users/markus/include/boost/spirit/home/qi/detail/attributes.hpp:153: 9: 错误: 'transform_attribute, unsigned short, boost::spirit::qi::domain, void>' 的模糊偏特化:transform_attribute

既然它已经失败了#include <boost/spirit/include/qi.hpp>,也许有人知道如何纠正这个BOOST_FUSION_ADAPT_ADT短语?


整个代码:/*!@文件 rtsp_request.hpp * */


顺便说一句,尝试仅将 BOOST_FUSION_ADAPT_STRUCT 与业力生成器功能一起使用也会失败:

在 /Users/markus/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20 包含的文件中:/Users/markus/include/boost/spirit/home/support/string_traits.hpp:156:26:错误:未定义模板 'boost::spirit::traits::char_type_of' 的隐式实例化 typedef typename char_type_of::type char_type; ^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:242:14:注意:在此处请求的模板类“boost::spirit::traits::extract_c_string”的实例化类型名 extract_c_string::char_type const* ^ /Users/markus/include/boost/spirit/home/karma/string/lit.hpp:180:21: 注意:将推导的模板参数替换为函数模板'get_c_string' [with String = rtsp::

, mpl_::int_<0>, boost::spirit::unused_type>, boost::spirit::context, boost::spirit::locals >, boost::spirit::unused_type, rtsp::response>' 请求这里返回 compile(expr).generate(sink, context, used, attr); ^ /Users/markus/include/boost/spirit/home/karma/generate.hpp:91:23:注意:在函数模板特化的实例化中 'boost::spirit::karma::generate , mpl_::int_<0 >, boost::proto::exprns_::expr > >, 0>, rtsp::response>' 在此请求 return karma::generate(sink, expr, attr); ^ /Users/markus/Entwicklung/HTW/RTSP-Streaming/src/streaming_lib/include/rtsp_request.hpp:69:38:注意:在函数模板特化的实例化中'boost::spirit::karma:: generate , boost::proto::exprns_::expr >>, 0>, rtsp::response>' 在此处请求 return boost::spirit::karma::generate(sink, lit("RTSP/"), reponse) ; ^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:96:12:注意:模板在这里声明 struct char_type_of; ^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:179:20:错误:没有匹配函数调用'call'返回extract_c_string::call(str); ^~~~~~~~~~~~~~~~~~~~~~~~~ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:238:42: 注意:在成员函数'boost::spirit::traits::extract_c_string::call'的实例化中 此处请求返回 extract_c_string::call(str); ^ /Users/markus/include/boost/spirit/home/karma/string/lit.hpp:180:21:注意:在函数模板特化'boost::spirit::traits::get_c_string'的实例化中请求get_c_string( ^ /Users/markus/include/boost/spirit/home/karma/generate.hpp:69:45: 注意:在函数模板特化的实例化中'boost::spirit::karma::literal_string::generate, mpl_:: int_<0>, boost::spirit::unused_type>, boost::spirit::context, boost::spirit::locals >, boost::spirit::unused_type, rtsp::response>' 这里请求返回编译( expr).generate(sink, context, 未使用, attr); ^ /Users/markus/include/boost/spirit/home/karma/generate.hpp:91:23:注意:在函数模板特化的实例化中 'boost::spirit::karma::generate , mpl_::int_<0 >, boost::proto::exprns_::expr > >, 0>, rtsp::response>' 在此请求 return karma::generate(sink, expr, attr); ^ /Users/markus/Entwicklung/HTW/RTSP-Streaming/src/streaming_lib/include/rtsp_request.hpp:69:38:注意:在函数模板特化'boost::spirit::karma::generate的实例化中,boost: :proto::exprns_::expr > >, 0>, rtsp::response>' 在此处请求 return boost::spirit::karma::generate(sink, lit("RTSP/"), reponse);'反对'rtsp::response'静态T const调用(T* str)^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:165:25:注意:候选模板被忽略:无法匹配'const T ' 反对 'rtsp::response' 静态 T const调用 (T const* str)

0 投票
1 回答
166 浏览

c++ - boost::spirit::karma 替代生成器,boost::variant 包含一个字符串和字符串别名

我有一个boost::variant由几种类型组成的,包括字符串类型别名和字符串类型。字符串类型别名与boost::spirit::qi替代解析器一样工作,但boost::spirit::karma替代生成器不仅不使用所需的字符串类型别名生成器规则,而且甚至不使用内置的字符串生成器,它不仅以一种不需要的而且意想不到的方式工作,当变体包含字符串类型时:

有人可以解释这种行为,以及我如何得到想要的行为吗?

对于后一种我想,我必须摆脱所有字符串类型别名并使用显式结构作为类型,但随后我又陷入了丑陋的一个成员结构的极端情况。(https://codereview.stackexchange.com/q/206259/95143 但是,第一个输出至少不仅仅是“bar”,即当模式生成器也不是时不使用字符串生成器,看起来像对我来说是一个错误,即我无法理解。