#parser-combinator #branch #pattern #string #second #contain #chumsky

chumsky-branch

chumsky解析库的分支组合器

2个不稳定版本

0.2.0 2023年2月19日
0.1.1 2022年8月18日
0.1.0 2022年8月18日

#165 in 解析器工具

MIT 许可证

15KB
318

chumsky-branch 许可证: MIT chumsky-branch on crates.io chumsky-branch on docs.rs 源代码仓库

此crate定义了三个用于chumsky解析库的解析组合器

  • not_starting_with:此组合器接受一个模式列表,并匹配与所有模式不同的最短输入字符串。
  • not_containing:此组合器接受一个模式列表,并匹配不包含任何模式的任何字符串。
  • branch:此组合器允许分支到解析器。每个分支定义两个解析器。当第一个解析器匹配时,它只选择该分支,即使第二个解析器失败。然后使用第二个解析器来产生输出类型。你可以组合尽可能多的分支(类似于 if else)。然后,你必须定义一个else分支,它只接受一个 String 并需要从该字符串中产生输出。如果你想要解析原始输入和一些语法,这很有用。

示例

use chumsky::prelude::*;
use chumsky_branch::prelude::*;

#[derive(Debug, Eq, PartialEq)]
enum Token {
	Placeholder(String),
	Comment(String),
	Verbatim(String)
}

impl Token {
	fn lexer() -> impl Parser<char, Self, Error = Simple<char>> {
		branch(
			"{{",
			text::ident().then_ignore(just("}}")).map(Self::Placeholder)
		)
		.or_branch(
			"/*",
			not_containing(["*/"])
				.then_ignore(just("*/"))
				.map(Self::Comment)
		)
		.or_else(Self::Verbatim)
	}
}

fn lexer() -> impl Parser<char, Vec<Token>, Error = Simple<char>> {
	Token::lexer().repeated().then_ignore(end())
}

let input = "/* Greet the user */Hello {{name}}!";
assert_eq!(&lexer().parse(input).unwrap(), &[
	Token::Comment(" Greet the user ".to_owned()),
	Token::Verbatim("Hello ".to_owned()),
	Token::Placeholder("name".to_owned()),
	Token::Verbatim("!".to_owned())
]);

依赖项

~2.5MB
~35K SLoC