1.X3-Warming up

2023-10-17 13:30
文章标签 x3 warming

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/225733

相关文章

地平线旭日X3开发板--摄像头驱动是否可以支持v4l2接口?

mipi摄像头,除了调用HB_VIN接口外,是否能支持v4l2接口 ? 因为当前HB_VIN接口是非开源的,很多东西无法看到,也没法改动。 现在有这样的需求,每一帧图像除了分辨率等信息之外, 需要加入更多的图像其他信息,现在好像我无法改动这部分的内容。 比如除了获得一帧图像之外,还要获得该帧图像的时间戳、增益和曝光时间等其他标识信息。 官方回复 目前不支持

HK1-BOX X3刷UBUNTU 24.04,并开启WIFI

端午刚好有点时间,顺便把改完散热的HK1-BOX刷了个最新OC版的UBUNTU 24,这里记录下操作的步骤: 准备材料 HK1-BOX S905X3:注意X4的不行固件没匹配的。建议先改完散热,不然作为7X24小时的机器长时间高温还是很伤硬件的一个8G的TF卡:注意是TF卡,之前我想着USB端口可以用就直接刷到U盘了,结果切换系统时启动不了rufus-3.20:用于刷写UBUNTU到TF卡(看

验证“哥德巴赫猜想”/水仙花数/给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形

循环-04. 验证“哥德巴赫猜想”(20) 数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。 输入格式: 输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。 输出格式

RDK X3(arm64) 测试国产双目摄像头Astra Pro Plus

0. 环境 - 亚博智能的ROSMASTER-X3 标准版(双目是 Astra Pro Plus) - RDK X3 1.0 1. RDK X3 1.0 串口通信 波特率 921600 root/root mobaterm -> Session -> VNC     -> 192.168.8.108:5900     -> runrise 2. 是否识别到设备 2.1 USB扩展版上

RDK X3(aarch64) 测试手柄

0. 环境 - 亚博智能的ROSMASTER-X3 标准版 - XDK X3 1.0 - 冰原狼等win10免驱的手柄 1. RDK X3 1.0 串口通信 波特率 921600 root/root mobaterm -> Session -> VNC     -> 192.168.8.108:5900     -> runrise 2. 测试 ROSMASTER-X3 标准版 配套

地平线X3开发板Intel Realsense深度相机调试记录

1.  预编译包 编译这个SDK花费了5.6个小时,为了方便各位后续使用, 各位可以直接下载编译好的文件,包含C++和Python的库,相关文件已经上传至百度云(提取码:awe4 )。 在提供的这些文件中,压缩包built_realsense.zip为这些文件夹的集合。 文件夹lib、include和bin的内容都要放在/usr/local文件夹下文件夹python3的内容注意要放在/us

地平线旭日X3开发板跑分测试

前言 一般拿到手机或者电脑后评测时我们喜欢跑跑分,可以看看战胜了多少网友。 而对于这个国产旭日x3的CPU自然也想看看到底和国际大厂的类似CPU性能是否有差异, 所以实际测试看看。 从最终的测试结果来看是不失所望的,本CPU和配置一致的iMx8M性能是一样的, 测试数值甚至高了一点,所以完全不用怀疑本CPU的性能还有5T算力的BPU,强悍妥妥的, 后面跑AI一点都不用心虚,放肆造!发烧

地平线X3开发板Swap使用说明

准备好旭日X3派、连接好网络 并验证系统版本 root@ubuntu:~# cat /etc/version x3j3_lnx_db_20220622 输入以下指令系统更新(其他版本同理,依赖项报错可至资源中心更新系统镜像或输入命令解决): apt update apt upgrade reboot 如果在 apt upgrade 的时候遇到libssl-dev和hobot-a

地平线旭日X3开发板编译USB网卡驱动 AX88772B

由于使用的激光雷达是网口输出的, 为了不占用X3派已有的网口,接上去了一个绿联的usb网卡, 发现系统没有驱动,所以动手看看能不能自己编译一个 首先lsusb查看一下网卡型号 发现型号是AX88772B,去官网看了一下,发现官方提供驱动 AX88772B - Low-Power USB 2.0 to Fast Ethernet Controller | ASIX 下

人体跟随小车(旭日x3派,yolov5,ros2)

最终现象 人体跟随 策略 底盘主控是stm32f103c8t6,读取左右轮编码器并标定速度,读取mpu6050的yaw值一并传至上位机。上位机通过usb摄像头捕获图像,送入模型进行推理,根据得到的结果生成控制指令下发给底盘进行人体跟随。