1个不稳定版本
0.1.0 | 2019年6月18日 |
---|
#315 在 解析工具
47KB
1K SLoC
rcombinators
rcombinators
是 pcombinators
库的 Rust 版本,提供 Rust 中的解析器组合器。与一些其他解析器库不同,它没有使用太多的魔法语法,这同时也意味着需要更多的样板代码,并且由于“简单”的处理方式,偶尔会有更低的性能。
与 pcombinators
相比,我们仍然实现了高达 100 倍的吞吐量以及类型安全,使得编写解析器更少出错。
一个工作解析器的示例可以在 examples/json/
中找到,这是一个工作但简单的 JSON 解析器(例如,它不处理字符串中的转义字符),展示了如何结合 rcombinators 提供的解析器。
lib.rs
:
rcombinators 是一个没有特殊魔法的解析器组合库。它旨在既易于使用又相对快速,而不使用太多的特殊语法或宏。
您将注意到两种类型的解析器,它们只是在细微方面有所不同
- 以大写字母开头的解析器是结构体(如
Int
、Sequence
)。您可以使用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