用 nom 5.0 解析数字

2024-03-02

我正在尝试使用 Nom 5.0 解析一个大文件(数十 GB)流。解析器的一部分尝试解析数字:

use nom::IResult;
use nom::character::streaming::{char, digit1};
// use nom::character::complete::{char, digit1};
use nom::combinator::{map, opt};
use nom::multi::many1;
use nom::sequence::{preceded, tuple};

pub fn number(input: &str) -> IResult<&str, &str> {
    map(
        tuple((
            opt(char('-')),
            many1(digit1),
            opt(preceded(char('.'), many1(digit1)))
        )),
        |_| "0"
    )(input)
}

(显然,它不应该为所有数字返回“0”;这只是为了使函数尽可能简单。)对于这个解析器,我编写了一个测试:

#[test]
fn match_positive_integer() {
    let (_, res) = number("0").unwrap();
    assert_eq!("0", res);
}

此测试失败Incomplete(Size(1))因为“小数”opt()想要读取数据但数据不存在。如果我切换到complete匹配器的版本(如注释掉的行),测试通过。

我认为这实际上会在生产中起作用,因为在抱怨不完整性时会提供额外的数据,但我仍然想创建单元测试。此外,如果数字恰好是文件中输入的最后一位,那么在生产中也会出现此问题。如何让流 Nom 解析器相信没有更多可用数据?


人们可以说原始形式的测试是正确的:解析器无法决定给定的输入是否是数字,因此解析结果实际上尚未确定。在生产中,尤其是在读取大文件时,已读取但待解析的字节的缓冲区可能会在以下位置之间结束:could是一个数字,除非它实际上不是。然后,解析器需要保留其当前状态并请求更多输入,以便它可以重试/继续。考虑到Incomplete不是最终错误,而是I don't even know: This could be an error depending on the next byte, this problem is undecidable as of yet!.

您可以使用complete-组合器 https://docs.rs/nom/5.0.1/nom/combinator/fn.complete.html 在你的顶级解析器上所以当你实际上达到了EOF,你就错了。Incomplete-结果within顶级解析器应该被处理,例如通过扩大读取缓冲区一定的余量并重试。

您可以将解析器包装在complete()-当前单元测试本地的解析器并对其进行测试。一些符合调子的东西

#[test]
fn match_positive_integer() {
    let (_, res) = complete(number("0")).unwrap();
    assert_eq!("0", res);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 nom 5.0 解析数字 的相关文章

随机推荐

  • 错误:在初始化尝试调用方法“值”之前无法调用滑块上的方法

    我写了类似下面的东西 id为 PLUS I的div的onclick 我收到以下错误 cannot call methods on slider prior to initialization attempted to call method
  • 使用 mpi4py 接收多个发送命令

    如何修改以下代码 改编自http materials jeremybejarano com MPIwithPython pointToPoint html http materials jeremybejarano com MPIwithP
  • matlab中传递和保存匿名函数

    我想要一个函数 例如 一个 fit 函数 返回一个匿名函数 通常存储在struct 我可以保存并稍后使用 然而 路过 func倾向于传递函数指针而不是函数本身 是一个inline函数是做到这一点的唯一方法吗 我想避免inline因为它非常慢
  • Django 选择字段

    我正在尝试解决以下问题 我的网页只能看到版主 此页面显示的字段 用户注册后 用户名 名字 姓氏 电子邮件 状态 相关性等 我需要显示带有此字段的数据库中存储的所有用户信息的表 但其中两个字段有选择 所以我想做出一个选项 版主可以选择另一个选
  • 简单地将 OpenMp Parallel for 转换为 c# Parallel for

    你好 我正在将这个 c openmp 并行转换为 c 并行 但它说 错误 1 并非所有代码路径都返回 lambda 表达式类型的值 System Func
  • 测试pdo的php代码可用吗?

    我想用PDO http php net manual en book pdo php但我不确定我的主机是否已正确设置 我如何在 PHP 中测试它是否已设置并适用于 MySQL php 5 1 始终安装 PDO 您可以使用 phpinfo 检
  • 扩展方法需要将类声明为静态

    为什么扩展方法要求声明类是静态的 这是编译器的要求吗 它在 C 4 规范的语言规范第 10 6 9 节中规定 当方法的第一个参数 包括 this 修饰符 即 方法被认为是一个扩展 方法 扩展方法只能是 以非泛型 非嵌套方式声明 静态类 第一
  • Three.js:有没有办法获取组的边界框

    我可以为 Threejs js 中的组获取 边界框吗 我在 Three js 中有一个对象列表 我将它们全部分组在一个单元中 我想获取组的高度和宽度 所以我尝试使用 Box3 来确定高度和宽度 有什么方法可以获取 Threejs 中对象组的
  • 在 Rails 集成规范中向同一控制器发出两个请求

    我在 Rails 集成测试中使用 rspec 向同一个 url 发出两个请求时遇到问题 it does something do get something status gt any other header lt lt lt lt lt
  • 如何在 Bash 中通过curl从谷歌驱动器下载大文件?

    我想制作一个非常简单的 bash 脚本 用于通过 google 驱动器下载文件Drive API 所以在这种情况下 谷歌驱动器上有一个大文件 我安装了OAuth 2 0 Playground在我的谷歌驱动器帐户上 然后在Select the
  • 是否有某些情况下 SIGKILL 不起作用?

    是否存在在 Linux 上运行的应用程序未阻止信号的情况SIGKILL 不会被射击杀死SIGKILL signal SIGKILL无法被阻止或忽略 SIGSTOP也不可以 如果进程在系统调用 内部 被阻塞 等待 I O 就是一个例子 等待失
  • 你如何优化你的Javascript?

    嗯 简单的问题 对吧 但没有那么简单的答案 在 Firefox 中 我使用 Firebug 控制台 配置文件 但是 在其他浏览器中该怎么办 像 Internet Explorer Opera Safari 在 Windows 上 随着时间的
  • 如何生成包含 R 中数据帧数据的 QR 码?

    我有一个实验室分析仪 可以生成 csv 或 xlsx 格式的结果 但现在我必须手动将输出结果手动输入到我们的结果跟踪软件系统中 因为复制粘贴不起作用 我想编写一个 R 脚本 可以将 csv 的结果转换为软件程序 我能想到的最好方法是将结果生
  • exec*() 后内存使用情况会发生什么

    C 父程序进行一些处理并分配内存 然后调用 execvp 所有已分配但未释放的内存会发生什么 它是自动释放还是作为垃圾保留 exec 用新程序完全替换了旧进程的内存 这包括所有分配的内存 因此不会留下任何垃圾 但请注意 文件描述符等其他资源
  • 如何理解Haskell中的“柯里化”?

    假设有一个名为 smallerc 的函数 smallerc Integer gt Integer gt Integer smallerc x y if x lt y then x else y 为什么不使用以下方式声明该函数 smaller
  • gcloud 应用程序部署“--appyaml”标志似乎不起作用

    对于 Google App Engine 我想注入env variables进入我的app yaml部署后 在文档中gcloud app deploy 我看到有标志 appyaml这将 使用特定的 app yaml 进行部署 该 app y
  • ASP.NET MVC - 显示项目列表,每个项目都有一个项目列表

    我希望这是解释这一点的最好方式 我有 3 个视图对象 学校 课程和班级 每所学校都有多个课程 每个课程可以有多个班级 将一门课程视为一个学习计划 班级是实际的班级 在我的主视图中 我显示所有学校 然后单击一所学校即可转到它 在该 课程视图
  • Zend Framework:控制器目录中的子目录

    我正在为我的网站使用 Zend Framework 并且刚刚创建了一个特殊的模块 api 来创建 嗯 一个 API 现在 我的模块中有很多控制器 我想在此控制器目录中创建子目录以 整理 它 我的新结构将是这样的 controllers co
  • 根据条件删除整行无法处理 400,000 行

    我有这个宏来删除那些不是 chr9 的整行 我总共有 401 094 行 它似乎编译得很好 但我的 Excel 冻结了 我必须强制退出 我认为这可能是一个低效的算法或者代码中的一些错误 Sub deleteNonChr9 Dim lastr
  • 用 nom 5.0 解析数字

    我正在尝试使用 Nom 5 0 解析一个大文件 数十 GB 流 解析器的一部分尝试解析数字 use nom IResult use nom character streaming char digit1 use nom character