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 …...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
