问题标签 [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.
regex - How to match regular expression but return the remaining part of the input in Rust Nom?
I am trying to use Nom 6.1.2 to parse a relatively simple Lisp like language, where I need to capture identifiers of the form [a-z][a-zA-Z0-9_\-\.]
. I tried to use re_match
but this is expecting the whole input
to match not just the first part of the string. I want to be able to match these identifiers as part of a larger context, so I want it to return the remaining part of the input to be passed on to other parsers, in a parser combinator fashion.
The test I want this to pass is the following:
The last assertion in the above test fails.
If I was using something like the alphanumeric
function this would work fine, but this doesn't capture the regular expression I want.
I could hand code this myself and somehow check the first character and the subsequent ones, but I have several other situations where I need to parse different regular expressions, and it will become unmaintainable.
What is the right way to take the part that matches a regular expression and continue with parsing the rest of the larger input?
rust - 如何在 nom 的解析器中使用解析器?
我正在尝试解析包含一些压缩格式数据的格式。如何将解压缩的部分作为常规解析的一部分进行解析?目前我遇到了借用检查器的问题,因为错误部分nom
希望compressed_data
在从返回时引用该部分parse_header
,这将超出范围。
parsing - 用 nom 解析可变空格分隔的列表
如何使用可能由空格分隔或不分隔的令牌列表?
我正在尝试使用(6.1.2)以cedict格式解析中文罗马化(拼音)。nom
例如"ni3 hao3 ma5"
,由于转录中的人为错误,有时写为"ni3hao3ma5"
或"ni3hao3 ma5"
(注意可变间距)。
我已经编写了一个解析器来处理单个音节,例如["ni3", "hao3", "ma5"]
,我正在尝试使用 anom::multi::separated_list0
来解析它,如下所示:
Err(Error(Error { input: "", code: SeparatedList }))
但是,在所有代币都被消耗后,我得到了一个。
rust - 使用 Rust NOM 解析库迭代多行
我正在尝试为 Rust 中的一个项目学习 NOM。我有一个文本文件,其中包括:
[tag="#43674"]char[/tag]
每行有多个标签背靠背。我正在尝试提取“#43674”和“char”,将它们存储在一个元组中(x, y)
,然后将它们推送到Vec<(x, y)>
文本文件每一行的向量中。到目前为止,我已经成功地将解析器组合成两个函数;一个用于“#43674”,一个用于“char”,然后我将它们组合在一起返回<IResult<&str, (String, String)>
。这是代码:
如何在文本文件的给定行上迭代此函数?我已经有一个将文本文件迭代成行的函数,但是我需要color_char
为该行中的每个闭包重复。我完全错过了重点吗?
rust - 如何使用 Rust nom 为这种结构文本编写解析器?
我有以下数据
基本上它代表三个条目:
每个条目都有一个标题和一个正文。标题使用单行(不包括行尾),正文使用所有后续行,直到遇到分隔线 ( sep/
)。我想要的结果是一个条目向量。如何使用 nom 来解析它?我对 nom 很陌生,我不能让这些部分一起工作并形成一个工作解析器。以下是我所拥有的:
parsing - 如何强制 nom 解析整个输入字符串?
我正在使用 nom 版本 6.1.2,我正在尝试解析字符串,例如
A 2 1 2
.
目前,我很乐意至少区分符合要求的输入和不符合要求的输入。(之后我想将输出更改为一个元组,其中“A”作为第一个值,第二个值是 u16 数字的向量。)
字符串总是必须以大写字母 A 开头,之后至少应该有一个空格,然后是一个数字。此外,可以有任意多的额外空格和数字。以数字结尾而不是空格很重要。所有数字都将在 u16 的范围内。我已经写了以下函数:
另外我想提一下,对于使用 CompleteStr 的此类问题有一些答案,但这不再是一个选项,因为它已在一段时间前被删除。
人们解释说我的行为的原因是 nom 不知道字符串的切片何时结束,因此我得到parse_and: Err(Incomplete(Size(1)))
作为输入示例的答案。
parsing - 在 Rust nom 中选择函数特征和解析器特征
我有使用 Haskell parsec 库的经验,在 Haskell 中,我们只是在任何地方都使用函数。
Rust nom 提供Parser
trait 并且任何实现它的类型都可以像instance.parse(intput)
.
但是像map
不返回的组合器Parser
我想知道,什么时候我们应该更喜欢Parser
trait,什么时候应该更喜欢impl FnMut(I) -> IResult<I, O2, E>
.
我的猜测是,我们总是更喜欢使用Parser
trait 作为参数(所以我们对参数的限制较少)和impl FnMut
返回(这样用户使用起来更方便)。
rust - 如何使用 Rust 的解析器库 nom 正确解析这个程序
我想解析一个由这个 BNF 表示的程序:
这个 BNF 解析小程序。log_and 表示逻辑与。
我使用解析器库 nom 编写了 Rust 程序:
此代码输出 parse 的结果a && b
。
log_and_expression
解析程序。
我想要的结果是a LogAnd b
。但结果是:
这意味着a And &b
。
如何使用 nom 正确解析该程序?
parsing - 使用 nom 解析带有反斜杠转义的单引号的单引号字符串
这是Parsing single-quoted string with escaped quotes with Nom 5和Parse string with escaped single quotes的变体。我想将'1 \' 2 \ 3 \\ 4'
(原始字符序列)之类的字符串解析为(Rust 字符串),所以除了字符串内部的"1 \\' 2 \\ 3 \\\\ 4"
可能性之外,我不关心任何转义。\'
尝试使用链接问题中的代码:
只有前 3 个案例按预期工作。
regex - 模式 /.*foobar/ 的等效 `nom` 解析器/组合器是什么?
我一直在阅读6.2.1的文档,nom
并且正在尝试构建一个解析器,它将匹配任意数量的字符(包括零),后跟单词 foobar: /.*foobar/
。
nom::bytes::complete::take_until("foobar")
几乎做了我想要的,但它不会消耗foobar
自己,所以我不得不这样做:
我倾向于根据传统的正则表达式语法进行思考,然后必须将其映射到提供的可用构造nom
。我越来越善于注意到nom
结构更适合的场景,但是是否有 regex-to-nom 备忘单?