#parser-combinator #parser #message-parser #combinator #string #copy-less #rich-error-message

markab_parser

一个简单、无复制和丰富错误信息的解析器组合库

7 个版本 (破坏性更新)

0.7.0 2019年1月9日
0.6.0 2019年1月7日
0.5.0 2019年1月3日
0.4.0 2019年1月3日
0.1.0 2018年12月28日

#141 in 解析工具

MIT/Apache

49KB
2.5K SLoC

markab_parser

本软件包提供简单、无复制和丰富错误信息的字符串解析器组合

创建简单解析器

您可以使用 charactercharacter_classstring 创建简单解析器。

每个方法都返回一个实现 Parser 特性的类,CharacterParserCharacterClassParserStringParser,并通过调用 parse 方法返回源字符串的切片。

use markab_parser::{
	string,
	Parser,
	};

let src = "requirement";
let mut pos = 0;
let parser = string("requirement");
let result = parser.parse(src, &mut pos);
assert!(result.is_ok());
assert_eq!(result.ok().unwrap(), "requirement");
assert_eq!(pos, 11);

组合解析器

Parser 特性提供了解析器组合的方法。

use markab_parser::{
	character,
	character_class,
	Parser,
	};

// require "1" and return "1"
let parser = character('1');
// require "12" and return ("1","2")
let seq = parser.and_then(character('2'));
// require "1" or "2" and return Either("1","2")
let ord = character_class(false, &[], &['1'..'2']);
// require `0-9`+ and return as usize
let map = character_class(false, &[], &['0'..'9'])
	.one_or_more()
	.stringify()
	.map(|num| num.parse::<usize>().unwrap());

创建新的解析器

如果解析器有参数,则应实现 Parser 特性。如果没有参数,则应实现 Parseable 特性。Parseable 特性提供静态方法 Parseable::parseParseable::get_parser 来获取用于组合的解析器实例

变更日志

版本 0.1.0

  • 添加原始解析器。

版本 0.2.0

  • 添加 AndParserNotParser

版本 0.3.0

  • 为类型添加 DebugDisplay 实现。

版本 0.4.0

  • 从错误类型的参数类型中删除解析器类型。
  • map_parser 模块变为公共。

版本 0.5.0

  • 从 MapParserError 的参数类型中删除解析器类型。

版本 0.6.0

  • 简化生命周期。
  • 从 Parseable 特性中删除错误类型。(以装箱成本为代价)

版本 0.7.0

  • 从 MapParser/GenParser 中删除函数参数类型。
  • 要求/错误类型现在需要将解析器类型作为参数。
  • 将错误类型添加到 Parseable。(不再需要装箱)
  • 向 OrderParser 添加合并方法。

依赖项

~46KB