问题标签 [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 回答
1041 浏览

rust - 如何将 nom take_while 和 is_digit 用于 &str 输入

我正在尝试学习 nom 并且在take_while不接受is_digit或任何其他方面遇到问题is_xxxx

我有要解析的行看起来像这样

我想在哪里获得“123”部分(最终还有 ABCDEF 和 (...) 部分。但我猜当时有一件事)。

我的解析器目前看起来像这样

is_digit定义看起来像这样

并且由于id解析器采用 a&str它会抱怨类型不匹配。但是无论如何有可能以某种方式使用 is_digit 吗?我可以在某处进行类型转换而无需分配任何东西。我真的希望这尽可能高效。

感觉提供的is_xxxx功能应该在这种情况下使用,但我可能错了。

谢谢!

0 投票
1 回答
640 浏览

rust - 用 nom 5.0 解析数字

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

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

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

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

0 投票
1 回答
662 浏览

rust - 如何使用 nom 解析稍微模棱两可的数据?

RFC1738中,BNFdomainlabel如下:

域标签 = 字母数字 | 字母数字 * [ 字母数字 | "-" ] 字母数字

也就是说,它要么是一个字母数字,要么是一个字符串,其中第一个/最后一个字符必须是一个字母数字,但中间字符可以是一个字母数字或破折号。

我如何用nom实现这个?忽略单字符场景以简化案例,我最后的尝试是:

这样做的问题是middle可以消耗最后一个字符,因此right失败,因为没有要消耗的字符。

解析器应该能够尝试所有可能的消费路径,但如何做到这一点nom

0 投票
1 回答
167 浏览

regex - 如何按 nom 解析匹配的分隔符?

我想通过nom库以四种形式(“20190919”、“2019.09.19”、“2019-09-19”和“2019/09/19”)解析 YMD 日期。

我从iso8601解析器开始,它只解析“YYYY-MM-DD”形式。我尝试匹配分隔符并将其重用于下一次匹配,如正则表达式(\d{4})([.-/]?)(\d{2})\2(\d{2})

原来这段代码有效:

但显然它看起来很奇怪。

是否有一些 nom 工具可以以更合适的方式进行操作?

(这个关于nom功能的问题,以及如何在那里正确地做事。不仅仅是这个特定的例子。)

0 投票
0 回答
174 浏览

rust - 使用 nom 以非零数字开头?

我正在尝试使用此处nom显示的 EBNF编写降价解析器。在尝试解析数字时,我有点卡住如何表达以非零数字开头。

TLDR:您如何实施Number = NonZeroDigit { Digit };

我目前的实现看起来像

这个似乎也更简单一些,符合nom.

我不确定我是否想抛出某种错误?因为它可能只是这不是一个数字,而是某种字符串,如日期或时间。Number也许在 markdown 的语法中包含 a 的概念甚至没有意义?

0 投票
1 回答
1785 浏览

rust - 使用 nom 5.0 解析二进制文件

问题

有一个文件里面有多个标题,但对我来说,它只重要一个和它之后的数据。此标头在文件中重复多次。

它的幻数是:ASCII 或0x65 0x51 0x48 0x54 0x52HEX 格式的 A3046。在找到第一个字节后,解析器必须获取所有字节0xff,然后重复剩余的头,直到 EOF。

我的解决方案

首先我加载了文件:

我用以下方法声明了幻数:pub static QT_MAGIC: &[u8; 5] = b"A3046"; 作为测试,我编写了以下函数只是为了尝试它是否可以找到第一个标头。

但是,当测试运行时,Ok 是None有价值的。它肯定应该找到一些东西。我做错了什么?

我没有发现使用 nom5 解析字节的示例,而且作为 rust 新手也无济于事。如何使用这些规则解析所有块?

0 投票
2 回答
859 浏览

parsing - 用转义的单引号解析字符串

我想解析一个字符串,其中包含单引号之间的 ASCII 字符,并且可以连续包含两个 ' 的转义单引号。

'单引号之间包含的字符串值 -> '' 等等...'

这应该导致:

包含在单引号之间的字符串值 -> ' 等等...

如何检测转义引号而不是字符串的结尾?

0 投票
1 回答
557 浏览

parsing - 用 nom 解析多行注释

我正在尝试编写一个识别多行注释的名词解析器......

...并消耗/丢弃(同样的事情,对吗?)结果:

这几乎可以工作。我知道 take_until 在 之前停止*/,但我不知道该怎么做才能让它包含它。

给出结果

所以我的问题是,我如何获得完整的评论,包括结尾*/

谢谢!

0 投票
1 回答
1307 浏览

rust - 使用 Nom 5 解析带有转义引号的单引号字符串

我是 Rust 和 Nom 的新手,我正在尝试解析可能包含转义引号的(单)引号字符串,例如'foo\' bar'or 'λx → x', ''or ' '

我找到了escaped!宏,它的文档说:

第一个参数匹配普通字符(它不能接受控制字符),第二个参数是控制字符(如大多数语言中的 \),第三个参数匹配转义字符

由于我想在匹配器中为“普通字符”匹配除反斜杠之外的任何内容,我尝试使用take_till!

但是,当尝试解析时'x',这会返回Err(Incomplete(Size(1)))。搜索此问题时,人们通常建议使用CompleteStr,但这不在 Nom 5 中。解决此问题的正确方法是什么?

0 投票
2 回答
1071 浏览

parsing - Rust - 如何在 nom 中解析 UTF-8 字母字符?

我正在尝试解析字母字符的字符序列,包括德语变音符号 (ä ö ü) 和 UTF-8 字符集中的其他字母字符。这是我首先尝试的解析器:

但它仅适用于 ASCII 字母字符 (a-zA-Z)。我尝试通过以下方式执行char解析char

但这甚至不会解析“hello”,而是会导致Incomplete(Size(1))错误:

你如何解析nom中的 UTF-8 字母字符?我的代码片段:

当我运行这个测试时,

我得到:

我知道chars 已经用 Rust 进行了 UTF-8 编码(感谢上帝,全能),但似乎 nom 库的行为不像我预期的那样。我正在使用nom 5.1.0