问题标签 [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.
rust - 如何实现不跳过标签的类似 take_until_and_consume 的解析器组合器?
我想编写一个 nom 解析器组合器,它需要尽可能多的字节,包括标签序列。我尝试使用take_until_and_consume!
,但我发现生成的解析器组合器丢弃了标记序列:
结果是:
我想要的是将标签序列(在本例中为反斜杠字符)包含在结果中:
我怎样才能做到这一点?
parsing - 使用 `nom` 处理自定义枚举类型是否有意义?
我正在尝试为简单的查询语言实现解析器。目标是operations
从文本中生成,然后在将它们传递到树之前对其进行评估。如果我理解正确,我将不得不实现一些 nom 特征(InputLength
, InputTake
, Slice
)。
在实现特征的部分过程InputTake
中,我意识到我应该返回枚举的子切片,这些子切片代表我的查询操作,其中可以通过标识符进行拆分。例如,我可能会解析一个标识符name_of_var
,而这个take_split()
方法可能会产生 2 个切片,这对我来说没有意义。
我应该在这里做什么?我不喜欢切片布尔/数字的想法,因为它们只是作为一个整体才有意义。
None
在我认为字节片无效的情况下,您如何看待返回?
parsing - 如何使用 nom 精确匹配一个字节?
我想将一个字母字符 ( a-zA-Z
) 与 nom 完全匹配。
我知道我可以take_while!
用这样的东西贪婪地匹配:
但我找不到如何只匹配一个字节。有one_of!
,但我不能使用闭包,我必须传递整个切片:
rust - 如何结合 nom 解析器来获得更面向位的数据接口?
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 的读取指针前进,然后手动管理它,但同样,这似乎是不必要的额外工作。
rust - 具有严格格式的可选字段
我正在尝试构建nom解析器来检查 ID 为 UUID 的 URL
我创建了以下内容:
它可以很好地处理几乎所有情况:
除了 ID 不是有效 UUID 的情况:
据我了解,这是因为opt!
将 innerErr
转换为None
.
我想将 ID 作为可选部分,但如果它存在,它应该是一个有效的 UUID。
不幸的是,我不明白如何将这两件事结合起来:可选性和严格格式。
rust - 使用 nom errorkind 返回简单自定义错误的正确方法是什么?
添加到 nom 的简单错误处理程序
第一个编译没有错误,第二个出错了
错误是
为什么第一个有效而第二个无效?我能做些什么来解决它?我尝试将第二个签名更改为entity<&[u8],&str,ErrorKind>
然后更改为i32
但u32
没有成功。
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 可能更好吗?
csv - 如何在 nom 中匹配 CSV 样式的引号字符串?
就本问题而言,CSV 样式的带引号的字符串是一个字符串,其中:
- 字符串正好以 1 开始和结束
"
。 - 字符串中的两个双引号折叠成一个双引号。
"Alo""ha"
→<code>阿罗”哈。 - "" 本身是一个空字符串。
"A""" e"
无法解析错误输入,例如。它是一个A"
, 后面是 junke"
。
我已经尝试了几件事,但都没有完全奏效。
得益于 Mozilla IRC 上#nom 用户 pinkieval 的帮助,我得到了最接近的结果:
这不能正确捕获字符串的结尾。
我也尝试将re_match!
宏与 一起使用r#""([^"]|"")*""#
,但这总是导致Err::Incomplete(1)
.
我已经确定Nom 1.0 的给定 CSV 示例不适用于我描述的带引号的 CSV 字符串,但我知道实现不同。
rust - 用 nom 解析整数总是会导致 Incomplete
我尝试的一切都给了我Incomplete(Size(1))
。我现在最好的猜测是:
测试:
有时在我的变体(例如添加complete!
)中,如果我在末尾添加一个字符,我就能够解析它。
我想为此获得一个有效的解析器(最终我希望这将允许我为u64
包装器类型创建一个解析器)但更大的图景我想了解如何自己正确构建解析器。
macros - nom 的 "$i" 宏参数从何而来?
我试图了解 Rust 宏捕获是如何工作的,并且正在查看nom解析器库。
位置nom/src/bytes.rs声明tag!
使用($i:expr, $tag: expr)
. tag!
然而,在所有使用它的地方,它只与一个参数一起使用,即tag!("+")
. 示例:nom-lua52/op.rs。我读过关于宏的教程,但是这个结构似乎很特别。
似乎输入$i
是隐含的?