#parser-combinator #combine #regex #re-exports #construct #data #versioning

combine-regex-1

重新导出 regex 1.0,使 combine 能够同时使用 0.2 和 1.0

1 个稳定版本

使用旧的 Rust 2015

1.0.0 2018 年 10 月 6 日

#316解析工具

Download history 18/week @ 2024-03-12 8/week @ 2024-03-19 13/week @ 2024-03-26 32/week @ 2024-04-02 10/week @ 2024-04-09 8/week @ 2024-04-16 17/week @ 2024-04-23 7/week @ 2024-04-30 9/week @ 2024-05-07 9/week @ 2024-05-14 7/week @ 2024-05-21 25/week @ 2024-05-28 28/week @ 2024-06-04 25/week @ 2024-06-11 24/week @ 2024-06-18 21/week @ 2024-06-25

102 每月下载量

MIT/Apache

2KB

combine

Build Status Docs Gitter

一个受 Haskell 库 Parsec 启发的 Rust 解析器组合器实现。与 Parsec 类似,解析器默认为 LL(1),但可以通过 attempt 组合器选择使用任意长预测。

示例

extern crate combine;
use combine::{many1, Parser, sep_by};
use combine::parser::char::{letter, space};

// Construct a parser that parses *many* (and at least *1) *letter*s
let word = many1(letter());

// Construct a parser that parses many *word*s where each word is *separated by* a (white)*space*
let mut parser = sep_by(word, space())
    // Combine can collect into any type implementing `Default + Extend` so we need to assist rustc
    // by telling it that `sep_by` should collect into a `Vec` and `many1` should collect to a `String`
    .map(|mut words: Vec<String>| words.pop());
let result = parser.parse("Pick up that word!");
// `parse` returns `Result` where `Ok` contains a tuple of the parsers output and any remaining input.
assert_eq!(result, Ok((Some("word".to_string()), "!")));

更大的示例可以在 示例测试基准测试 文件夹中找到。

教程

教程以及关于 combine 内部运作的解释可以在 Wiki 中找到。

翻译

日语

文档和示例

crates.io

功能

  • 解析任意流 - Combine 可以解析从 &[u8]&str 到迭代器和 Read 实例的任何内容。如果内置流不适合您的用例,您甚至可以自己实现一些特质来创建自己的自定义

  • 零拷贝解析 - 当解析内存数据时,combine 可以在不复制的情况下进行解析。请参阅 range 模块,其中包含专门针对零拷贝解析的解析器。

  • 部分解析 - Combine 解析器可以在解析过程中停止在任何位置,并在之后无需丢失任何进度的情况下继续解析。这使得可以从 io 设备(如套接字)开始解析部分数据,而无需担心是否存在足够的数据来完成解析。如果需要更多数据,解析器将停止,并在更多数据可用时从同一位置恢复。请参阅 异步示例本帖 以获取示例和介绍。

关于

解析器组合器是一种函数,它广泛地说,接收多个解析器作为参数,并返回一个新解析器,通过组合这些解析器来创建。例如,many 解析器接收一个解析器 p 作为输入,并返回一个新的解析器,该解析器将 p 应用零次或多次。多亏了解析器组合器提供的模块化,可以在不实现底层管道的同时,仍然在需要时拥有 Rust 的全部功能,定义各种任务的处理程序。

该库遵循 语义版本控制

如果您最终尝试使用它,我欢迎您对它的反馈。我通常在一天内通过打开一个问题、发送电子邮件或在 Gitter 上发帖来联系到我。

常见问题解答

为什么我的错误包含难以理解的位位置?

由于 combine 致力于创建几乎没有开销的解析器,因此通过 &str&[T] 的流不携带任何额外的位置信息,而是仅依赖于比较缓冲区的指针以检查哪个 Stream 比另一个 Stream 更前进。为了检索更好的位置,可以调用表示位置的 PointerOffset 上的 translate_position 或将流包装在 State 中。

它与 nom 有何不同?

https://github.com/Marwes/combine/issues/73 包含讨论和链接到与 nom 的比较。

在 combine 中编写的解析器

格式和协议

杂项

额外内容

combine-language 中有一个额外的 crate,它包含用于词法和解析编程语言的解析器。

贡献

最简单的方式就是打开一个问题,说明您在使用 combine 时遇到的问题,但如果您有兴趣向库添加内容,这里有一些易于着手的工作列表。

  • 添加额外的解析器 如果您有其他解析器的建议,只需打开一个问题或 PR,并提供实现。
  • 添加额外的示例 更多的 combine 使用示例总是有用的!
  • 添加和改进文档 这不是最花哨的工作,但无法过分强调良好文档的重要性。

依赖关系

~2–3MB
~53K SLoC