- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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 解析器没有更多可用数据?
最佳答案
可以说测试的原始形式是正确的:解析器无法确定给定的输入是否为数字,因此解析结果实际上尚未确定。在生产中,尤其是像您一样读取大文件时,已读取但待解析字节的缓冲区可能恰好在可能 之间结束,除非它实际上不是。然后,解析器需要保留其当前状态并请求更多输入以便重试/继续。 Incomplete
不是最终错误,而是我什至不知道:这可能是一个错误,具体取决于下一个字节,这个问题目前还无法确定!
.
您可以使用 complete
-combinator 在你的顶级解析器上 所以当你实际上到达 EOF
时,你就错了。 不完整
-results within 顶级解析器应该被处理,例如通过将读取缓冲区扩大一些余量并重试。
您可以将解析器包装在 complete()
中 - 当前单元测试的本地解析器并对其进行测试。一些符合的调子
#[test]
fn match_positive_integer() {
let (_, res) = complete(number("0")).unwrap();
assert_eq!("0", res);
}
关于rust - 使用 nom 5.0 解析数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57914504/
鉴于吃掉异常总是糟糕的 juju 并且重新抛出异常会丢失调用堆栈,重构以下内容的正确方法是什么? 饮食异常(exception): try { … do something meaningful
我尝试为 PanierModel 的属性赋值,但在图片上收到此错误 NoSuchMethodError:在 null 上调用 getter 'nom'。接收者; null 尝试调用:nom class
我正在尝试使用 nom5.0 解析以下备用字符串 "A-Za-z0-9" 或 "A-Z|a-z|0-9" 我尝试了以下但无济于事 pub enum Node { Range(Vec), } f
我想将像 "ParseThis" 或 "parseThis" 这样的字符串解析成像 ["Parse", "This"], map_res!( take_till!(
我有这个使用 nom 4.2.2 的 Rust 程序。 (我冒昧地扩展了 nom 解析器功能。) extern crate failure; extern crate nom; use failure
tl;dr:我正在努力寻找需要使用 nom 进行前瞻的文本解析器的文档或示例。 长版 我正在使用 nom 来解析 6502 程序集。我正在努力创建一个可以解析各种寻址模式的解析器。任何给定的操作码都将
我试图使用nom::bits::bits从&[u8]向量中提取7位,但是我发现剩余数据不正确,似乎它必须是4/8的整数倍,但我不是当然。 像这样的一些代码(标称值= 5.12): fn take_7_
我正在尝试为一种简单的查询语言实现一个解析器。目标是从文本生成操作,然后在将它们向上传递到树之前评估它们。如果我理解正确,我将不得不实现一些 nom 特征(InputLength、InputTake、
我正在尝试编写一个识别多行注释的 nom 解析器... /* yo! */ ...并消耗/丢弃(同样的事情,对吧?)结果: use nom::{ bytes::complete::{tag, ta
我想通过nom库解析四种形式的YMD日期(“20190919”、“2019.09.19”、“2019-09-19”和“2019/09/19”) . 我从 iso8601 开始仅解析“YYYY-MM-D
我正在学习 nom,作为一个测试示例,我正在尝试解析字符串直到出现分隔符。如果我的定界符是 /,那么我想匹配该定界符之前的所有内容。为此,像这样的解析器可以工作: named!(gobbledygoo
我正在开发一个模板引擎,其中一些语法可能是这样的: {{ somevar|filter }} 代替 somevar 可以是任意“表达式”,也就是说,可以是像 somevar 这样的变量名,也可以是嵌套
我在 nom 中编写了一个完全无状态的解析器,现在我需要将它包装在几个有状态的层中。 我有一个名为 alt_fn 的顶级解析函数这将为我提供下一个解析输出作为枚举变体,其细节可能并不重要。 我需要做三
我正在尝试使用 nom 创建一个解析器,它将解析一些可能是许多选项之一的文本。名称有 alt!因为当值在编译时已知,但我的值不会。 这是我尝试创建自己的解析器,它可以接受 Vec匹配,我遇到了几个问题
我是 Rust 的新手,三个小时以来我一直在努力思考这个问题,我想我快要疯了。我想要的只是一个接受字符串 "true" 并返回枚举 Value::Const(true) 的解析器。这是我目前所拥有的:
我需要从一个 u8 数组中解析一个 32 位整数数组(小端),但是下一个整数只有在当前整数的第 31 位被设置时才存在。如果其余部分不存在,则应将数组的其余部分设置为零。我不确定如何有条件地解析下一个
我想用 nom 恰好匹配一个字母字符 (a-zA-Z)。 我知道我可以使用 take_while! 贪婪地匹配这样的东西: // match one or more alphabetical char
我已经在 nom 中创建了一些重要的解析器,所以我现在对它非常熟悉。到目前为止,我创建的所有解析器始终将整个输入切片提供给解析器。 我想创建一个流解析器,我假设这意味着我可以继续将字节输入解析器,直到
我正在尝试使用 nom 解析一个字符串,该字符串要么被换行符终止,要么在使用后到达输入末尾。我有以下似乎应该编译的代码: named!(am_implied , do_parse!(
我正在使用 nom解析一些二进制 65c816 汇编数据。我的解析器结构的一部分将操作码拆分为单独的形式,然后获取它们的参数(如果有的话)。一个示例解析器目前看起来像这样: named!(absolu
我是一名优秀的程序员,十分优秀!