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 函数。这个函数的一个重载接受四个参数:
- 指向输入的起始位置的迭代器。
- 指向输入的结束位置之后的迭代器。
- 解析器对象。
- 另一个名为跳过解析器(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 函数返回 true 或 false 取决于解析的结果。第一个迭代器以引用的方式传递。在成功解析时,这个迭代器会被重新定位到被解析器消耗的最右侧位置。如果这个位置等于 last,那么就有了完全匹配。如果不等于 last,那么就有了部分匹配。部分匹配发生在解析器只能解析输入的一部分时。
需要注意的是,我们在调用 parse 时直接将解析器嵌入到调用中。调用 parse 时,表达式会评估为一个临时的无名解析器,然后传递给 parse() 函数,被使用,然后销毁。
在这里,我们选择使解析器通用化,通过将其作为一个模板来实现,参数化迭代器类型。通过这种方式,它可以接受来自任何符合STL标准的序列的数据,只要迭代器符合前向迭代器的要求。
相关文章:
1.X3-Warming up
/* 此程序使用 Boost Spirit 库来解析用户提供的逗号分隔的数字列表。它演示了如何使用 Spirit 来定义解析 器和执行解析操作,并且在用户输入时反复执行解析操作。用户可以提供一系列逗号分隔的数字,程序会检查它们 是否符合指定的解析规则。如果解析成功…...
【23真题】两电一邮之一,难度骤降!24可能回升!
今天分享的是23年电子科技大学858的信号与系统试题及解析。23成电858真题和22年相比,难度骤降!今年我预测可能会有反弹。22年成电858真题,是我做过的22真题中数一数二的难度!23年一般,但是题目也很好,真的很…...
持续集成部署-k8s-资源调度:DaemonSet
持续集成部署-k8s-资源调度:DaemonSet 1. DaemonSet 简介2. 部署 Fluent 日志收集程序1. DaemonSet 简介 在 Kubernetes 中,DaemonSet 是一种用于在集群中运行一个 Pod 副本的控制器对象。它可以保证在每个节点上都运行一个 Pod 副本,并且在节点加入或退出集群时自动地更新…...
RabbitMQ内容
RabbitMQ是一款开源的消息中间件,支持多个消息协议,包括AMQP、STOMP、MQTT等,它的主要功能是将分散的应用程序连接在一起,以便它们可以相互通信,从而构建可靠的、高效的分布式系统。 RabbitMQ的基础概念包括ÿ…...
搭建一个vscode+uni+vue的小程序项目
我们使用 vue2 创建工程作为示例,uni-app中Vue2版的组件库和插件也比较多,稳定、问题少,可以先参考下官方文档:uni-app官网 既然是使用vue脚手架,那肯定要全局安装vue/cli,已安装的可以跳过。 注意:Vue2创…...
处理ElementUI组件默认样式多次重复问题
问题截图: 解决办法: 在postcss.config.js文件里添加配置项: module.exports {plugins: {autoprefixer: {},cssnano: {} //添加这行代码}, } 处理结果: github issues: https://github.com/ElemeFE/element/is…...
配置hpa后,target显示<unknown>/50%
背景: 有两个服务,server 负责主要后端请求,bill 负责计量计费请求。服务都是使用 helm 部署。测试提了一个缺陷,说全部服务没有配置hpa。 解决一 按照之前的代码结构添加了hpa后,发现: ➜ kubectl get…...
用java实现抖音授权登录
要使用Java实现抖音授权登录,您需要使用抖音开放平台提供的API。以下是一个简单的Java代码示例,演示如何使用OAuth 2.0授权登录流程: 要使用Java实现抖音授权登录,您需要按照以下步骤进行操作: 创建抖音开放平台账号…...
Atlassian午餐会直播回顾:如何在Jira中进行项目时间与成本管理?
工时管理是项目过程管理的一个重要手段,通过科学记录项目组成员在项目执行过程中的任务完成和时间消耗情况,可以帮助管理者精准评估成员工作效率,实时掌握项目进展,并有效管控项目成本。 想要成为时间管理大师吗?在近…...
屏幕时代的数字化信息管理:从传统到纯软件的转变
随着数字化时代的推进,屏幕已经成为了企业和机构向外界传递信息的主要媒介。除了传统的手机和电脑屏幕,线下空间如办公楼、商场、店铺、医院、展厅等也需要利用屏幕来展示和发布各类信息。 管理这些屏幕和发布信息并不是一件容易的事情,特别是…...
Stm32_标准库_14_串口蓝牙模块_解决手机与蓝牙模块数据传输的不完整性
由手机向蓝牙模块传输时间信息,Stm32获取信息并将已存在信息修改为传入信息 测试代码: #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h"uint16_t num…...
基于深度学习的“语义通信编解码技术”框架分类
目录 基于神经网络的语义提取基于神经网络的语义信源编码基于神经网络的语义信源信道联合编码基于神经网络的语义编码与数字调制联合设计参考文献 基于神经网络的语义提取 在现有的信源编码前端加上一个语义提取神经网络[53] ,如图所示。语义提取神经网络的输入是原…...
信钰证券:股票抵押是好还是坏?
股票典当是指将持有的股票作为质押品向银行或其他金融机构融资的行为。股票典当有其优势和下风,下面咱们将从多个角度来剖析股票典当是否好仍是坏。 一、优势 1.占用资金少 相比较于其他融资办法,股票典当所需求占用的资金较少,只需将股票作…...
媒体基础:打开多模态大模型的新思路
编者按:2023年是微软亚洲研究院建院25周年。25年来,微软亚洲研究院探索并实践了一种独特且有效的企业研究院的新模式,并以此为基础产出了诸多对微软公司和全球社会都有积极影响的创新成果。一直以来,微软亚洲研究院致力于创造具有…...
dubbo-admin安装
一、dubbo-admin安装 1、环境准备 dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot,安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk,maven,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数据集: 二、 展示图片三、DataLoader数据加载器四、搭建神经网络五、 训练和测试第一次运行: 六、优化模型第二次优化后运行: 七、完整代码八、手写板实现输入识别功能 前言 注意…...
玩转代码| Vue 中 JSX 的特性,这一篇讲的明明白白
目录 什么时候使用JSX JSX在Vue2中的基本使用 配置 文本插值 条件与循环渲染 属性绑定 事件绑定 v-show与v-model 插槽 使用自定义组件 在method里返回JSX JSX是一种Javascript的语法扩展,即具备了Javascript的全部功能,同时又兼具html的语义…...
(vue)el-descriptions 描述列表无效
(vue)el-descriptions 描述列表无效 原因:element 的版本不够 解决:运行下面两个命令 npm uninstall element-ui //卸载之前安装的版本 npm i element-ui -S //重新安装解决参考:https://blog.csdn.net/weixin_59769148/article/details/1…...
ios 苹果手机日期格式问题
目录 问题解决其他 问题 ios 无法识别的时间戳格式:2023-10-17 11:10:49 可识别的: 2023/10/17 11:10:49 解决 const startTime 2023/10/17 11:10:49 startTime.replace(/-/g, /)// 获取时间差值 export const useDateDiff (startTime , endTime …...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
