问题标签 [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 - 如何将 nom take_while 和 is_digit 用于 &str 输入
我正在尝试学习 nom 并且在take_while
不接受is_digit
或任何其他方面遇到问题is_xxxx
。
我有要解析的行看起来像这样
我想在哪里获得“123”部分(最终还有 ABCDEF 和 (...) 部分。但我猜当时有一件事)。
我的解析器目前看起来像这样
is_digit
定义看起来像这样
并且由于id
解析器采用 a&str
它会抱怨类型不匹配。但是无论如何有可能以某种方式使用 is_digit 吗?我可以在某处进行类型转换而无需分配任何东西。我真的希望这尽可能高效。
感觉提供的is_xxxx
功能应该在这种情况下使用,但我可能错了。
谢谢!
rust - 用 nom 5.0 解析数字
我正在尝试使用 Nom 5.0 解析一个大文件(数十 GB)流。解析器的一部分尝试解析数字:
(显然,它不应该为所有数字返回“0”;这只是为了使函数尽可能简单。)对于这个解析器,我写了一个测试:
该测试失败,Incomplete(Size(1))
因为“小数”opt()
想要读取数据并且它不存在。如果我切换到complete
匹配器的版本(如注释掉的行),则测试通过。
我认为这实际上会在生产中起作用,因为在抱怨不完整时会提供额外的数据,但我仍然想创建单元测试。此外,如果某个数字恰好是文件中输入的最后一位,则该问题将在生产中出现。如何让流式 Nom 解析器相信没有更多可用数据?
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功能的问题,以及如何在那里正确地做事。不仅仅是这个特定的例子。)
rust - 使用 nom 以非零数字开头?
我正在尝试使用此处nom
显示的 EBNF编写降价解析器。在尝试解析数字时,我有点卡住如何表达以非零数字开头。
TLDR:您如何实施Number = NonZeroDigit { Digit };
我目前的实现看起来像
这个似乎也更简单一些,符合nom
.
我不确定我是否想抛出某种错误?因为它可能只是这不是一个数字,而是某种字符串,如日期或时间。Number
也许在 markdown 的语法中包含 a 的概念甚至没有意义?
rust - 使用 nom 5.0 解析二进制文件
问题
有一个文件里面有多个标题,但对我来说,它只重要一个和它之后的数据。此标头在文件中重复多次。
它的幻数是:ASCII 或0x65 0x51 0x48 0x54 0x52
HEX 格式的 A3046。在找到第一个字节后,解析器必须获取所有字节0xff
,然后重复剩余的头,直到 EOF。
我的解决方案
首先我加载了文件:
我用以下方法声明了幻数:pub static QT_MAGIC: &[u8; 5] = b"A3046";
作为测试,我编写了以下函数只是为了尝试它是否可以找到第一个标头。
但是,当测试运行时,Ok 是None
有价值的。它肯定应该找到一些东西。我做错了什么?
我没有发现使用 nom5 解析字节的示例,而且作为 rust 新手也无济于事。如何使用这些规则解析所有块?
parsing - 用转义的单引号解析字符串
我想解析一个字符串,其中包含单引号之间的 ASCII 字符,并且可以连续包含两个 ' 的转义单引号。
'单引号之间包含的字符串值 -> '' 等等...'
这应该导致:
包含在单引号之间的字符串值 -> ' 等等...
如何检测转义引号而不是字符串的结尾?
parsing - 用 nom 解析多行注释
我正在尝试编写一个识别多行注释的名词解析器......
...并消耗/丢弃(同样的事情,对吗?)结果:
这几乎可以工作。我知道 take_until 在 之前停止*/
,但我不知道该怎么做才能让它包含它。
给出结果
所以我的问题是,我如何获得完整的评论,包括结尾*/
谢谢!
rust - 使用 Nom 5 解析带有转义引号的单引号字符串
我是 Rust 和 Nom 的新手,我正在尝试解析可能包含转义引号的(单)引号字符串,例如'foo\' bar'
or 'λx → x'
, ''
or ' '
。
我找到了escaped!
宏,它的文档说:
第一个参数匹配普通字符(它不能接受控制字符),第二个参数是控制字符(如大多数语言中的 \),第三个参数匹配转义字符
由于我想在匹配器中为“普通字符”匹配除反斜杠之外的任何内容,我尝试使用take_till!
:
但是,当尝试解析时'x'
,这会返回Err(Incomplete(Size(1)))
。搜索此问题时,人们通常建议使用CompleteStr
,但这不在 Nom 5 中。解决此问题的正确方法是什么?