1个不稳定版本

0.1.0 2019年6月18日

#315解析工具

MIT 许可证

47KB
1K SLoC

rcombinators

Build Status

rcombinatorspcombinators 库的 Rust 版本,提供 Rust 中的解析器组合器。与一些其他解析器库不同,它没有使用太多的魔法语法,这同时也意味着需要更多的样板代码,并且由于“简单”的处理方式,偶尔会有更低的性能。

pcombinators 相比,我们仍然实现了高达 100 倍的吞吐量以及类型安全,使得编写解析器更少出错。

一个工作解析器的示例可以在 examples/json/ 中找到,这是一个工作但简单的 JSON 解析器(例如,它不处理字符串中的转义字符),展示了如何结合 rcombinators 提供的解析器。


lib.rs:

rcombinators 是一个没有特殊魔法的解析器组合库。它旨在既易于使用又相对快速,而不使用太多的特殊语法或宏。

您将注意到两种类型的解析器,它们只是在细微方面有所不同

  • 以大写字母开头的解析器是结构体(如 IntSequence)。您可以使用 ParserName::new() 或专门的构造方法创建它们。
  • 以小写字母开头(蛇形命名空间,如 string_of)。这些是返回 Parser 对象的函数,这些对象由一个或多个基本解析器组合而成。

实现 Parser 特性的结果对象在用法上完全相同。

请注意,并不是所有原语和组合器都在包级别导出!只有“重要的”那些。

下面是一个使用它的简短示例

use rcombinators::combinators;
use rcombinators::primitives;
use rcombinators::ParseState;
use rcombinators::Parser;

// Goal: Parse the string between the parentheses, and then the float.
let mut ps = ParseState::new("(a1b3c4) -1.25e-1");

let mut some_string = combinators::Alternative::new(
    (primitives::StringParser::new("xyz"),
     primitives::string_of("abcde12345",
     combinators::RepeatSpec::Min(1))));
let mut in_parens = combinators::Sequence::new(
    (primitives::StringParser::new("("),
     some_string,
     primitives::StringParser::new(")")));
assert_eq!(Ok(
    ("(".to_string(),
     "a1b3c4".to_string(),
     ")".to_string())), in_parens.parse(&mut ps));

// You can continue using a ParseState, for example when implementing your own parsers.
let _ = primitives::whitespace().parse(&mut ps);
// Parsers returned by functions such as float() should be cached when used more frequently.
// This saves time due to not needing to construct the parsers repeatedly.
assert_eq!(Ok(-0.125), primitives::float().parse(&mut ps));

依赖关系

~0.6–1MB
~15K SLoC