2个不稳定版本
0.2.0 | 2023年2月19日 |
---|---|
0.1.1 | 2022年8月18日 |
0.1.0 |
|
#165 in 解析器工具
15KB
318 行
chumsky-branch
此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