Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >boost::spirit::qi::phrase_parse中某些未定义的行为

boost::spirit::qi::phrase_parse中某些未定义的行为
EN

Stack Overflow用户
提问于 2014-10-16 09:33:14
回答 1查看 238关注 0票数 1

我正在学习如何使用boost::灵体库。我以这个例子list1.cpp为例,并在我的计算机上编译它--它工作得很好。

但是,如果我稍微修改它-如果我初始化解析器本身

代码语言:javascript
运行
AI代码解释
复制
auto parser = qi::double_ >> *(',' >> qi::double_);

作为全局变量,并将其传递给phrase_parse,一切都会变得疯狂。以下是完整的修改代码(只修改了1行,添加了1行)- http://pastebin.com/5rWS3pMt

如果我运行原始代码并将"3.14,3.15“传递给stdin,它会说解析成功,但是修改后的版本失败了。我尝试了许多相同类型的修改--将解析器分配给全局变量--在一些编译器上的一些变体中,它是分段错误。

我不明白为什么和怎么会这样。下面是另一个简单的版本,它在clang++上打印true,然后在g++上打印分段错误,在g++上只打印分段错误

代码语言:javascript
运行
AI代码解释
复制
#include <boost/spirit/include/qi.hpp>

#include <iostream>
#include <string>

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;

const auto doubles_parser_global = qi::double_ >> *(',' >> qi::double_);

int main() {
    const auto doubles_parser_local = qi::double_ >> *(',' >> qi::double_);

    const std::string nums {"3.14, 3.15, 3.1415926"};

    std::cout << std::boolalpha;

    std::cout
        << qi::phrase_parse(
            nums.cbegin(), nums.cend(), doubles_parser_local, ascii::space
        )
        << std::endl;                             // works fine

    std::cout
        << qi::phrase_parse(
            nums.cbegin(), nums.cend(), doubles_parser_global, ascii::space
        )                                         // this segfaults
        << std::endl;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-16 10:19:01

不能使用auto存储解析器表达式。

您需要直接从临时表达式中计算值,或者需要分配给规则/语法:

代码语言:javascript
运行
AI代码解释
复制
const qi::rule<std::string::const_iterator, qi::space_type> doubles_parser_local = qi::double_ >> *(',' >> qi::double_);

您可以在最新的BOost版本(可能是dev分支)上吃蛋糕,应该有一个BOOST_SPIRIT_AUTO宏。

这正在成为一个常见问题项目:

我认为这实际上是对底层Proto库的限制。github上有一个Proto-0xlib版本(由Eric编写),它承诺通过完全重新设计引用来解决这些问题。我认为这需要一些Boost Proto目前无法使用的c++11特性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26410498

复制
相关文章
Boost.Spirit 初体验
使用代码生成代码是一件十分美妙的事情,于是有了各种代码生成器。但是生成代码,意味着要有对生成规则的分析和处理。 Boost.Spirit 就是这么一个语法分析工具,它实现了对上下文无关文法的LL分析。支持EBNF(扩展巴科斯范式)。 Boost.Spirit 的使用真的是把模板嵌套用到了极致。确实这么做造成了非常强的扩展性,生成的代码也非常高效,但是嵌套的太复杂了,对于初学者而言真心难看懂。 你能想象在学习阶段一个不是太明白的错误导致编译器报出的几十层模板嵌套错误信息的感受吗?而且,这么复杂的模板嵌套还直接导致了编译速度的巨慢无比。 其实在之前,我已经使用过Spirit的Classic版本,即1.X版本,但是过多的复制操作让我觉得当时用得很低效,还好分析的内容并不复杂所以没。体现出来 这回就来研究下功能更强劲的2.X 版本。
owent
2023/03/06
9170
Boost.Spirit 初体验
使用代码生成代码是一件十分美妙的事情,于是有了各种代码生成器。但是生成代码,意味着要有对生成规则的分析和处理。 Boost.Spirit 就是这么一个语法分析工具,它实现了对上下文无关文法的LL分析。支持EBNF(扩展巴科斯范式)。 Boost.Spirit 的使用真的是把模板嵌套用到了极致。确实这么做造成了非常强的扩展性,生成的代码也非常高效,但是嵌套的太复杂了,对于初学者而言真心难看懂。 你能想象在学习阶段一个不是太明白的错误导致编译器报出的几十层模板嵌套错误信息的感受吗?而且,这么复杂的模板嵌套还直接导致了编译速度的巨慢无比。 其实在之前,我已经使用过Spirit的Classic版本,即1.X版本,但是过多的复制操作让我觉得当时用得很低效,还好分析的内容并不复杂所以没。体现出来 这回就来研究下功能更强劲的2.X 版本。
owent
2018/08/01
3.3K0
C 和 C++ 中的未定义行为
theme: channing-cyan highlight: a11y-dark
鲸落c
2022/11/14
4.5K0
C/C++未定义行为
下面是一段代码,这段代码中有标准未定义的行为。代码如下: #include<iostream> using namespace std; int main() { int j = 0;
zy010101
2020/04/16
3.7K0
「我读」PL 观点 | 未定义行为有利的一面
Rust 官方团队 Ralf Jung 在 PL 观点 (PL Perspectives) 博客[1] 上发表了一篇文章 《Undefined Behavior deserves a better reputation》[2] ,文中对UB(未定义行为)有利的一面进行了详细的阐述。通过这篇文章,我们可以对UB 有更深入的理解。
张汉东
2021/11/25
1.7K0
《超越C++标准库:Boost库导引》:Boost库简介-字符串和文本处理
正则表达式对于解决相当数量的模式匹配(pattern-matching)问题是至关重要的。它们经常被用于处理长字符串、非精确地查找子字符串、根据某些格式tokenize字符串,或者依照某个标准对字符串进行修改。以前C++缺少对于正则表达式的支持,用户不得不求助于其它对正则表达式有强有力支持的语言,比如Perl,awk和sed。Regex对于正则表达式提供高效有力的支持,它遵循与标准模板库(STL)相同的设计理念,这使得它的用法相当直观。Regex已经被即将到来的(标准)库技术报告所采纳。更多信息请参阅“Library 5: Regex”。
用户7886150
2021/01/16
8930
无线充qi协议c语言详解,无线充电Qi协议正向通信FSK的解调设计[通俗易懂]
摘 要: 无线充电Qi协议提出发射器和接收器通过频率调制(FSK)方式进行正向通信,进而建立完整的通信状态控制。接收器可采用测宽法进行频率解调,然而由于电磁耦合变化、负载变化、载波占空比变化、测量量化等引起的误差,该方法无法满足实际应用的要求。该文针对传统测宽法抗干扰能力弱的问题,提出一种窗口滤波算法,通过参考相邻脉冲频率确定当前脉冲的有效频率,极大地提高了测宽法的抗干扰能力。经实例分析,改进后的测宽法抗干扰能力强、逻辑简单,为无线充电正向通信FSK解调提供一种可行的方法。
全栈程序员站长
2022/07/04
2.9K0
无线充qi协议c语言详解,无线充电Qi协议正向通信FSK的解调设计[通俗易懂]
boost::string or boost::regex
当中用蓝色标记出的部分(layout, local_size_x, local_size_y, local_size_z, in)为keyword,斜体字部分(a, b, c)为数据类型为unsigned int的数字,请编写一个函数,用于从文件里抽取出a, b, c的值。当中文件名称为输入參数,该函数的返回值是抽取得到的a,b,c三个值。
全栈程序员站长
2022/07/08
2.2K0
boost 库中 filesystem::path 功能
boost filesystem::path 是对文件目录路径做处理的一个小的类,他把我们平时处理文件路径的繁琐功能简化到不能再简化,比如我们想获取一个路径中的文件名,只需要调用 object.filename().string() 就可以了,如果是C语言或者C++中提供的系统库中,我们是找不到这么方便的方法的。更多的一些功能见下面代码。你也可以查看 boost 帮助文档,查找更多的功能。
我与梦想有个约会
2023/10/20
6250
boost 库中 filesystem::path 功能
如何更快地将string转换成int/long
在很多追求性能的程序挑战赛中,经常会遇到一个操作:将 String 转换成 Integer/Long。如果你没有开发过高并发的系统,或者没有参加过任何性能挑战赛,可能会有这样的疑问:这有啥好讲究的,Integer.valueOf/Long.valueOf 又不是不能用。实际上,很多内置的转换工具类只满足了功能性的需求,在高并发场景下,可能会是热点方法,成为系统性能的瓶颈。
kirito-moe
2021/09/08
1.4K0
如何更快地将string转换成int/long
JVM中的线程行为
线程化是指同时执行程序过程以提高应用程序性能的实践。虽然直接在业务应用程序中使用线程并不常见,但它们一直在Java框架中使用。
银河1号
2019/04/12
1.1K0
JVM中的线程行为
MapReduce 编程实践:统计对象中的某些属性
文章目录 1. 生成数据 2. 编写实体类 3. Mapper类 4. Reducer类 5. Driver类 6. 运行 参考书:《Hadoop大数据原理与应用》 相关文章:MapReduce 编程实践 1. 生成数据 超市消费者 数据: id, 时间,消费金额,会员/非会员 使用 Python 生成虚拟数据 import random import time consumer_type = ['会员', '非会员'] vip, novip = 0, 0 vipValue, novipValue = 0
Michael阿明
2021/09/06
9170
Boost
我今天真的是被这个boost库搞到头炸,怎么在linux下安装boost库,及后续使用。一开始用sudo apt-get install libboost-dev倒是能解决代码中头文件引用不存在问题,但是编译不成功,总是会出现什么未定义引用错误,之后remove掉,重新下载源码编译还是会存在一些问题。
用户1145562
2020/10/23
2K0
关于某些特定直播场景中的技术分析
今天,小编为大家总结了一些在直播平台搭建中,在某些特定场景中的技术分析,对想要接触直播平台搭建流程的投资商提供些许技术理解和帮助,下面一起来看下:
云豹通讯员
2020/03/09
1.2K0
关于某些特定直播场景中的技术分析
Boost容器中的重载运算符
❝使用重载运算符operator,()和operator()()填充Boost容器数据。❞ 逗号,运算符填充数据: vector<int> v; v += 1, 2, 3, 4, 5, 6, 7, 8, 9; 括号()运算符填充数据: map<string, int> map; insert(map)("Apple", 5)("Orange", 10);
Qt君
2020/02/24
6130
实现nest中未定义参数的入参校验
当我们在dto层定义好参数字段后,客户端在调用时传入了未定义的字段,此时我们需要报错告知客户端这个字段不存在,在nest中默认不会报错,本文将分享这个问题的解决方案,欢迎各位感兴趣的开发者阅读本文。
神奇的程序员
2022/04/10
3.5K0
实现nest中未定义参数的入参校验
boost::bind和boost::function使用示例
C++11已支持bind和function,之前的不支持,但可以借助boost达到同样目的。看如下两段代码:
一见
2018/08/10
1.3K0
boost编译
经历了将近半年多的时间boost终于发布了1.35.0版本(前版本1.34.1发布于2007/7), 其编译方法和原来的编译方法基本上是一致的,主要改变包括1.34.0以来bjam的toolset所 提供的参数名称的改变(具体参见《boost1.34.0编译日志》)外,还包括bjam的编译默认 选项的变化,在1.35.0之前的版本默认编译时会自动编译各种版本的库,包括静态库、 动态库、debug库和release库等全部的版本,但是到了1.35.0时默认的选择仅仅编译release 版本的库,这样一来在开发的时候就不能进行必要的调试了,为了能够使其编译全部的版本 需要在bjam的命令行参数中添加一个–build-type=complete类型的参数来指明需要编译全 部的版本,所需要编译同时为了使得regex库能够通过ICU库支持Unicode,在编译上需要有 一些特殊的选择。我在Visual Studio 2005 Pro + SP1环境下编译了该库,为了避免走弯路 所以将其编译的方法进行说明,以方便大家编译。 由于boost是采用其自己的bjam工具通过命令行进行编译的,所以必须在Windows下开启console窗口,同时必须将Visual Studio中C++目录下的环境vcvarsall.bat配置脚本运行一遍,以设置好VC的编译器环境变量。 1. 编译不带ICU支持的boost库 此种情况下的boost库编译起来比较的简单,在准备好的console窗口中输入:
用户3519280
2023/07/08
2950
Spring中事务的传播行为
当我们在spring中调用Service中一个方法时,如果我们默认配置了对Service的事务管理,那么此时的Service将运行在一个由spring管理的事务环境中。由于在我们日常的开发时,通常会在一个Service接口中调用其它Service中的接口以此来完成一个完整的事务操作,这时就会发生服务接口嵌套调用的情况,spring通过事务传播行为控制当前事务如何传播到被嵌套调用的目标服务接口方法中的。下面我们想想了解一下在spring中都有哪些不同的事务传播行为,以前它们的区别。
吉林乌拉
2019/09/17
1.2K0
Spring中事务的传播行为
boost::function的用法
本片文章主要介绍boost::function的用法。 boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象。 1.  介绍     Boost.Function 库包含了一个类族的函数对象的包装。它的概念很像广义上的回调函数。其有着和函数指针相同的特性但是又包含了一个调用的接口。一个函数指针能够在能以地方被调用或者作为一个回调函数。boost.function能够代替函数指针并提供更大的灵活性。 2. 使用     Boost.Function 有两种
用户1198337
2018/01/19
1.5K0

相似问题

boost::spirit::qi::double_和boost::spirit::qi::int_

10

将boost::spirit::qi::phrase_parse()与qi::语法一起使用时出错

12

如何结合boost::spirit::lex & boost::spirit::qi?

113

使用boost::spirit::qi::symbols

11

boost::spirit::qi -可选匹配

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文