问题标签 [nom]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
548 浏览

rust - 如何实现不跳过标签的类似 take_until_and_consume 的解析器组合器?

我想编写一个 nom 解析器组合器,它需要尽可能多的字节,包括标签序列。我尝试使用take_until_and_consume!,但我发现生成的解析器组合器丢弃了标记序列:

结果是:

我想要的是将标签序列(在本例中为反斜杠字符)包含在结果中:

我怎样才能做到这一点?

0 投票
1 回答
285 浏览

parsing - 使用 `nom` 处理自定义枚举类型是否有意义?

我正在尝试为简单的查询语言实现解析器。目标是operations从文本中生成,然后在将它们传递到树之前对其进行评估。如果我理解正确,我将不得不实现一些 nom 特征(InputLength, InputTake, Slice)。

在实现特征的部分过程InputTake中,我意识到我应该返回枚举的子切片,这些子切片代表我的查询操作,其中可以通过标识符进行拆分。例如,我可能会解析一个标识符name_of_var,而这个take_split()方法可能会产生 2 个切片,这对我来说没有意义。

我应该在这里做什么?我不喜欢切片布尔/数字的想法,因为它们只是作为一个整体才有意义。

None在我认为字节片无效的情况下,您如何看待返回?

0 投票
1 回答
655 浏览

parsing - 如何使用 nom 精确匹配一个字节?

我想将一个字母字符 ( a-zA-Z) 与 nom 完全匹配。

我知道我可以take_while!用这样的东西贪婪地匹配:

但我找不到如何只匹配一个字节。有one_of!,但我不能使用闭包,我必须传递整个切片:

0 投票
0 回答
667 浏览

rust - 如何结合 nom 解析器来获得更面向位的数据接口?

我正在使用nom解码Rust 中的AIS消息。

AIS 消息由位向量组成;每条消息中的各个字段都是任意数量的位长,并且它们并不总是在字节边界上对齐。

然后这个位向量被 ASCII 编码,并嵌入到NMEA语句中。

来自http://catb.org/gpsd/AIVDM.html

数据有效载荷是一个 ASCII 编码的位向量。每个字符代表六位数据。要恢复六位,请从 ASCII 字符值中减去 48;如果结果大于 40,则减去 8。根据 [IEC-PAS],此编码的有效 ASCII 字符以“0”(64)开头,以“w”(87)结尾;但是,不使用中间范围“X”(88)到“_”(95)。

例子

  • !AIVDM,1,1,,A,D03Ovk1T1N>5N8ffqMhNfp0,0*68是 NMEA 句子
  • D03Ovk1T1N>5N8ffqMhNfp0是编码的 AIS 数据
  • 010100000000000011011111111110110011000001100100000001011110001110000101011110001000101110101110111001011101110000011110101110111000000000是解码后的 AIS 数据作为位向量

问题

我把这些列在一起是因为我认为它们可能是相关的……

1. 将 ASCII 解码为位向量

我可以手动完成,通过迭代字符,减去适当的值,并通过做大量的位移工作来构建一个字节数组,等等。这很好,但似乎我应该能够在 nom 中执行此操作,并将其与实际的 AIS 位解析器链接起来,从而消除临时字节数组。

2.读取任意位数

例如,可以从 nom 字节数组中读取 3 位。但是,每次调用bits!似乎一次消耗一个完整的字节(如果读入 a u8)。

例如:

将 3 位读入u8. 但如果我运行take_3_bits两次,我将消耗 16 位流。

我可以结合阅读:

调用get_field_1_and_2会给我一个(u8, u8)元组,其中第一项包含前 2 位,第二项包含接下来的 3 位,但 nom 在读取后仍将前进一个完整字节。

我可以peek用来阻止 nom 的读取指针前进,然后手动管理它,但同样,这似乎是不必要的额外工作。

0 投票
3 回答
342 浏览

rust - 具有严格格式的可选字段

我正在尝试构建nom解析器来检查 ID 为 UUID 的 URL

我创建了以下内容:

它可以很好地处理几乎所有情况:

除了 ID 不是有效 UUID 的情况:

据我了解,这是因为opt!将 innerErr转换为None.

我想将 ID 作为可选部分,但如果它存在,它应该是一个有效的 UUID。
不幸的是,我不明白如何将这两件事结合起来:可选性和严格格式。

0 投票
1 回答
1473 浏览

rust - 使用 nom errorkind 返回简单自定义错误的正确方法是什么?

添加到 nom 的简单错误处理程序

第一个编译没有错误,第二个出错了

错误是

为什么第一个有效而第二个无效?我能做些什么来解决它?我尝试将第二个签名更改为entity<&[u8],&str,ErrorKind>然后更改为i32u32没有成功。

0 投票
1 回答
539 浏览

parsing - 使用 nom 根据先前元素有条件地解析数组

我需要从 u8s 数组中解析一个 32 位整数数组(小字节序),但是下一个整数仅在当前整数的第 31 位被设置时才存在。如果其余的不存在,则数组的其余部分应设置为零。我不确定如何有条件地解析下一个元素。

假设该字段长 4 个字节。那么 parse_field 函数的结果就是这 4 个字节将被 le_u32 解析,这将是 [u32; 中的第一个元素;8] 数组。但是,如果设置了该字段的第 31 位。然后还有另外 4 个字节,它也像这个字段,它进入数组中的下一个元素。如果未设置,则函数必须返回,其余元素设置为零的数组。对于每个现有字段,这将继续。

例如对于以下输入:

你会得到[0x8000000a, 0x8000000b, 0, 0, 0, 0, 0, 0]

但是如果输入是

然后你会得到[0x8000000a, 0x8000000b, 0x8000000c, 0x8000000d, 0x8000000e, 0, 0, 0]

在这里使用 Vec 可能更好吗?

0 投票
1 回答
721 浏览

csv - 如何在 nom 中匹配 CSV 样式的引号字符串?

就本问题而言,CSV 样式的带引号的字符串是一个字符串,其中:

  1. 字符串正好以 1 开始和结束"
  2. 字符串中的两个双引号折叠成一个双引号。"Alo""ha"→<code>阿罗”哈。
  3. "" 本身是一个空字符串。
  4. "A""" e"无法解析错误输入,例如。它是一个A", 后面是 junk e"

我已经尝试了几件事,但都没有完全奏效。

得益于 Mozilla IRC 上#nom 用户 pinkieval 的帮助,我得到了最接近的结果:

这不能正确捕获字符串的结尾。

我也尝试将re_match!宏与 一起使用r#""([^"]|"")*""#,但这总是导致Err::Incomplete(1).

我已经确定Nom 1.0 的给定 CSV 示例不适用于我描述的带引号的 CSV 字符串,但我知道实现不同。

0 投票
2 回答
2397 浏览

rust - 用 nom 解析整数总是会导致 Incomplete

我尝试的一切都给了我Incomplete(Size(1))。我现在最好的猜测是:

测试:

有时在我的变体(例如添加complete!)中,如果我在末尾添加一个字符,我就能够解析它。

我想为此获得一个有效的解析器(最终我希望这将允许我为u64包装器类型创建一个解析器)但更大的图景我想了解如何自己正确构建解析器。

0 投票
1 回答
118 浏览

macros - nom 的 "$i" 宏参数从何而来?

我试图了解 Rust 宏捕获是如何工作的,并且正在查看nom解析器库。

位置nom/src/bytes.rs声明tag!使用($i:expr, $tag: expr). tag!然而,在所有使用它的地方,它只与一个参数一起使用,即tag!("+"). 示例:nom-lua52/op.rs。我读过关于宏的教程,但是这个结构似乎很特别。

似乎输入$i隐含的?