当前位置: 首页 > news >正文

1.X3-Warming up

/*
此程序使用 Boost Spirit 库来解析用户提供的逗号分隔的数字列表。它演示了如何使用 Spirit 来定义解析
器和执行解析操作,并且在用户输入时反复执行解析操作。用户可以提供一系列逗号分隔的数字,程序会检查它们
是否符合指定的解析规则。如果解析成功,程序将输出解析成功的消息,否则将输出解析失败的消息。
*/
#include <boost/spirit/home/x3.hpp>#include <iostream>
#include <string>
#include <vector>namespace client	//创建了名为 "client" 的命名空间,用于组织程序的代码。
{namespace x3 = boost::spirit::x3;  //创建了别名namespace ascii = boost::spirit::x3::ascii;/////  Our number list parser///template <typename Iterator>bool parse_numbers(Iterator first, Iterator last){using x3::double_;			//引入了 Spirit 的 double_ 解析器,用于解析浮点数using x3::phrase_parse;     //引入了 Spirit 的 phrase_parse 函数,用于执行解析。using ascii::space;			//:引入了 Spirit 的 space 解析器,用于跳过空白字符。bool r = phrase_parse(first,                          // Start Iteratorlast,                           // End Iteratordouble_ >> *(',' >> double_),   // The Parserspace                           // The Skip-Parser);if (first != last) // fail if we did not get a full matchreturn false;return r;}
}
//  Main program

int
main()
{std::cout << "/\n\n";std::cout << "\t\tA comma separated list parser for Spirit...\n\n";std::cout << "/\n\n";std::cout << "Give me a comma separated list of numbers.\n";std::cout << "Type [q or Q] to quit\n\n";std::string str;while (getline(std::cin, str)){if (str.empty() || str[0] == 'q' || str[0] == 'Q')break;if (client::parse_numbers(str.begin(), str.end())){std::cout << "-------------------------\n";std::cout << "Parsing succeeded\n";std::cout << str << " Parses OK: " << std::endl;}else{std::cout << "-------------------------\n";std::cout << "Parsing failed\n";std::cout << "-------------------------\n";}}std::cout << "Bye... :-) \n\n";return 0;
}

Trivial Example #1 Parsing a number

创建一个解析器,用于解析浮点数。

double_

Trivial Example #2 Parsing two numbers

创建一个解析器,用于接受包含两个浮点数的一行。

double_ >> double_

这段代码创建了一个解析器,可以识别包含两个浮点数的文本行。解析时,这两个浮点数需要通过逗号或空格等分隔符分开。程序中使用 double_ >> double_ 表达式,它将两个 double_ 解析器连接在一起,表示需要解析两个浮点数,它们之间用 “>>” 操作符表示“后跟”。这个示例强调了如何将简单的解析器组合成更复杂的解析器,以便解析更复杂的文本结构。

Trivial Example #3 Parsing zero or more numbers

创建一个解析器,可以接受零个或多个浮点数。

*double_

这段代码创建了一个解析器,可以接受零个或多个浮点数。它使用了 *double_,其中 * 是Kleene星号,表示可以重复出现前面的 double_ 解析器来匹配零个或多个浮点数。这是一种灵活的解析方式,允许匹配任意数量的浮点数,它类似于正则表达式中的 “*”,用于表示重复出现。作者提到了C++程序员可能会感到不太熟悉这种运算符的重载方式,但这是因为必须遵守C++的语法规则。

Trivial Example #4 Parsing a comma-delimited list of numbers

这个示例将创建一个解析器,用于接受逗号分隔的数字列表。

double_ >> *(char_(',') >> double_)

注意 char_(‘,’)。它是一个字符字面值解析器,可以识别逗号 ‘,’。在这种情况下,Kleene星号修改了一个更复杂的解析器,即由以下表达式生成的解析器:

(char_(',') >> double_)

这段代码创建了一个解析器,用于解析逗号分隔的数字列表。解析过程中,它期望一个浮点数,后面可以跟随零个或多个由逗号分隔的其他浮点数。double_ >> *(char_(',') >> double_) 表达式中,double_ 解析一个浮点数,*(char_(',') >> double_) 则表示零个或多个由逗号分隔的浮点数。char_(',') 用于识别逗号字符。括号用来确保逗号字符和浮点数之间的关系被正确解析。这个解析器的设计允许它有效地处理逗号分隔的数字列表。

Let’s Parse!

我们已经完成了解析器的定义。下一步是调用这个解析器来执行它的工作。有几种方法可以实现这一点。现在,我们将使用 phrase_parse 函数。这个函数的一个重载接受四个参数:

  1. 指向输入的起始位置的迭代器。
  2. 指向输入的结束位置之后的迭代器。
  3. 解析器对象。
  4. 另一个名为跳过解析器(skip parser)的解析器。
    在我们的示例中,我们希望跳过空格和制表符。Spirit库中还包括了另一个名为 space 的预定义解析器,它是一个非常简单的解析器,只识别空白字符。我们将使用 space 作为我们的跳过解析器。跳过解析器负责在解析器元素之间跳过字符,例如 double_ 和 char_。

好的,现在让我们开始解析!

template <typename Iterator>
bool parse_numbers(Iterator first, Iterator last)
{using x3::double_;using x3::phrase_parse;using ascii::space;bool r = phrase_parse(first,                          //  Start Iteratorlast,                           //  End Iteratordouble_ >> *(',' >> double_),   //  The Parserspace                           //  The Skip-Parser);if (first != last) // fail if we did not get a full matchreturn false;return r;
}

parse 函数返回 truefalse 取决于解析的结果。第一个迭代器以引用的方式传递。在成功解析时,这个迭代器会被重新定位到被解析器消耗的最右侧位置。如果这个位置等于 last,那么就有了完全匹配。如果不等于 last,那么就有了部分匹配。部分匹配发生在解析器只能解析输入的一部分时。

需要注意的是,我们在调用 parse 时直接将解析器嵌入到调用中。调用 parse 时,表达式会评估为一个临时的无名解析器,然后传递给 parse() 函数,被使用,然后销毁。

在这里,我们选择使解析器通用化,通过将其作为一个模板来实现,参数化迭代器类型。通过这种方式,它可以接受来自任何符合STL标准的序列的数据,只要迭代器符合前向迭代器的要求。

相关文章:

1.X3-Warming up

/* 此程序使用 Boost Spirit 库来解析用户提供的逗号分隔的数字列表。它演示了如何使用 Spirit 来定义解析 器和执行解析操作&#xff0c;并且在用户输入时反复执行解析操作。用户可以提供一系列逗号分隔的数字&#xff0c;程序会检查它们 是否符合指定的解析规则。如果解析成功…...

【23真题】两电一邮之一,难度骤降!24可能回升!

今天分享的是23年电子科技大学858的信号与系统试题及解析。23成电858真题和22年相比&#xff0c;难度骤降&#xff01;今年我预测可能会有反弹。22年成电858真题&#xff0c;是我做过的22真题中数一数二的难度&#xff01;23年一般&#xff0c;但是题目也很好&#xff0c;真的很…...

持续集成部署-k8s-资源调度:DaemonSet

持续集成部署-k8s-资源调度:DaemonSet 1. DaemonSet 简介2. 部署 Fluent 日志收集程序1. DaemonSet 简介 在 Kubernetes 中,DaemonSet 是一种用于在集群中运行一个 Pod 副本的控制器对象。它可以保证在每个节点上都运行一个 Pod 副本,并且在节点加入或退出集群时自动地更新…...

RabbitMQ内容

RabbitMQ是一款开源的消息中间件&#xff0c;支持多个消息协议&#xff0c;包括AMQP、STOMP、MQTT等&#xff0c;它的主要功能是将分散的应用程序连接在一起&#xff0c;以便它们可以相互通信&#xff0c;从而构建可靠的、高效的分布式系统。 RabbitMQ的基础概念包括&#xff…...

搭建一个vscode+uni+vue的小程序项目

我们使用 vue2 创建工程作为示例&#xff0c;uni-app中Vue2版的组件库和插件也比较多&#xff0c;稳定、问题少&#xff0c;可以先参考下官方文档:uni-app官网 既然是使用vue脚手架&#xff0c;那肯定要全局安装vue/cli&#xff0c;已安装的可以跳过。 注意&#xff1a;Vue2创…...

处理ElementUI组件默认样式多次重复问题

问题截图&#xff1a; 解决办法&#xff1a; 在postcss.config.js文件里添加配置项&#xff1a; module.exports {plugins: {autoprefixer: {},cssnano: {} //添加这行代码}, } 处理结果&#xff1a; github issues&#xff1a; https://github.com/ElemeFE/element/is…...

配置hpa后,target显示<unknown>/50%

背景&#xff1a; 有两个服务&#xff0c;server 负责主要后端请求&#xff0c;bill 负责计量计费请求。服务都是使用 helm 部署。测试提了一个缺陷&#xff0c;说全部服务没有配置hpa。 解决一 按照之前的代码结构添加了hpa后&#xff0c;发现&#xff1a; ➜ kubectl get…...

用java实现抖音授权登录

要使用Java实现抖音授权登录&#xff0c;您需要使用抖音开放平台提供的API。以下是一个简单的Java代码示例&#xff0c;演示如何使用OAuth 2.0授权登录流程&#xff1a; 要使用Java实现抖音授权登录&#xff0c;您需要按照以下步骤进行操作&#xff1a; 创建抖音开放平台账号…...

Atlassian午餐会直播回顾:如何在Jira中进行项目时间与成本管理?

工时管理是项目过程管理的一个重要手段&#xff0c;通过科学记录项目组成员在项目执行过程中的任务完成和时间消耗情况&#xff0c;可以帮助管理者精准评估成员工作效率&#xff0c;实时掌握项目进展&#xff0c;并有效管控项目成本。 想要成为时间管理大师吗&#xff1f;在近…...

屏幕时代的数字化信息管理:从传统到纯软件的转变

随着数字化时代的推进&#xff0c;屏幕已经成为了企业和机构向外界传递信息的主要媒介。除了传统的手机和电脑屏幕&#xff0c;线下空间如办公楼、商场、店铺、医院、展厅等也需要利用屏幕来展示和发布各类信息。 管理这些屏幕和发布信息并不是一件容易的事情&#xff0c;特别是…...

Stm32_标准库_14_串口蓝牙模块_解决手机与蓝牙模块数据传输的不完整性

由手机向蓝牙模块传输时间信息&#xff0c;Stm32获取信息并将已存在信息修改为传入信息 测试代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h"uint16_t num…...

基于深度学习的“语义通信编解码技术”框架分类

目录 基于神经网络的语义提取基于神经网络的语义信源编码基于神经网络的语义信源信道联合编码基于神经网络的语义编码与数字调制联合设计参考文献 基于神经网络的语义提取 在现有的信源编码前端加上一个语义提取神经网络[53] &#xff0c;如图所示。语义提取神经网络的输入是原…...

信钰证券:股票抵押是好还是坏?

股票典当是指将持有的股票作为质押品向银行或其他金融机构融资的行为。股票典当有其优势和下风&#xff0c;下面咱们将从多个角度来剖析股票典当是否好仍是坏。 一、优势 1.占用资金少 相比较于其他融资办法&#xff0c;股票典当所需求占用的资金较少&#xff0c;只需将股票作…...

媒体基础:打开多模态大模型的新思路

编者按&#xff1a;2023年是微软亚洲研究院建院25周年。25年来&#xff0c;微软亚洲研究院探索并实践了一种独特且有效的企业研究院的新模式&#xff0c;并以此为基础产出了诸多对微软公司和全球社会都有积极影响的创新成果。一直以来&#xff0c;微软亚洲研究院致力于创造具有…...

dubbo-admin安装

一、dubbo-admin安装 1、环境准备 dubbo-admin 是一个前后端分离的项目。前端使用vue&#xff0c;后端使用springboot&#xff0c;安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk&#xff0c;maven&#xff0c;nodejs 安装no…...

Kaggle - LLM Science Exam(三):Wikipedia RAG

文章目录 一、赛事概述1.1 OpenBookQA Dataset1.2 比赛背景1.3 评估方法和代码要求1.4 比赛数据集1.5 优秀notebook 二、 [EDA, Data gathering] LLM-SE ~ Wiki STEM | 1k DS2.1 Data overview2.2 Data gathering 三、如何高效收集数据3.1 概述3.2 与训练数据关联的维基百科类别…...

【机器学习】PyTorch-MNIST-手写字识别

文章目录 前言完成效果一、下载数据集手动下载代码下载MNIST数据集&#xff1a; 二、 展示图片三、DataLoader数据加载器四、搭建神经网络五、 训练和测试第一次运行&#xff1a; 六、优化模型第二次优化后运行&#xff1a; 七、完整代码八、手写板实现输入识别功能 前言 注意…...

玩转代码| Vue 中 JSX 的特性,这一篇讲的明明白白

目录 什么时候使用JSX JSX在Vue2中的基本使用 配置 文本插值 条件与循环渲染 属性绑定 事件绑定 v-show与v-model 插槽 使用自定义组件 在method里返回JSX JSX是一种Javascript的语法扩展&#xff0c;即具备了Javascript的全部功能&#xff0c;同时又兼具html的语义…...

(vue)el-descriptions 描述列表无效

(vue)el-descriptions 描述列表无效 原因&#xff1a;element 的版本不够 解决&#xff1a;运行下面两个命令 npm uninstall element-ui //卸载之前安装的版本 npm i element-ui -S //重新安装解决参考&#xff1a;https://blog.csdn.net/weixin_59769148/article/details/1…...

ios 苹果手机日期格式问题

目录 问题解决其他 问题 ios 无法识别的时间戳格式&#xff1a;2023-10-17 11:10:49 可识别的&#xff1a; 2023/10/17 11:10:49 解决 const startTime 2023/10/17 11:10:49 startTime.replace(/-/g, /)// 获取时间差值 export const useDateDiff (startTime , endTime …...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...