2个版本
0.1.1 | 2024年1月15日 |
---|---|
0.1.0 | 2024年1月14日 |
#143 in 解析工具
57KB
1K SLoC
Fabparse
Rust中的解析器组合库
lib.rs
:
Fabparse. 一个最小化的解析器组合库。
Fabparse 是一个基于特质的解析器组合库。大多数功能都在 Parser
特质中。Fabparse 为多种类型实现了解析器特质。它限制了自己只使用少数几个强大且可组合的操作。
这些都是解析器。
解析器 | 输入 | 解析 | 输出 | 解析后的输入 |
---|---|---|---|---|
'a' |
let mutinput= "abc" |
'a'.fab(&mutinput) |
'a' |
"bc" |
'a' |
let mutinput= "def" |
'a'.fab(&mutinput) |
FabError(...) |
"def" |
"abc" |
let mutinput= "abcdef" |
"abc".fab(&mutinput) |
"abc" |
"def" |
[1, 2] |
let mutinput= "[1, 2, 3].as_slice()" |
[1, 2].fab(&mutinput) |
[1, 2] |
[3] |
('a'..='z') |
let mutinput= "zyx" |
('a'..='z').fab(&mutinput) |
z |
"yx" |
take (2) |
let mutinput= "abc" |
take(2).fab(&mutinput) |
"ab" |
"c" |
❘c❘ c=='m' |
let mutinput= "moo" |
(❘c❘ c=='m').fab(&mutinput) |
'm' |
"oo" |
char::is_ascii_digit |
let mutinput= "123" |
char::is_ascii_digit.fab(&mutinput) |
'1' |
"23" |
letparser=❘c: char❘ifc=='m' {Some(5)} else {None} |
let mutinput= "moo" |
parser.fab(&mutinput) |
5 |
"oo" |
letparser=❘c: char❘ifc=='m' {Ok(5)} else {Err(ErrType)} |
let mutinput= "moo" |
parser.fab(&mutinput) |
5 |
"oo" |
自定义函数也可以是解析器。
fn is_it_a(input: &mut &str) -> Result<char, FabError> { 'a'.fab(input) }
解析器 | 输入 | 解析 | 输出 | 解析后的输入 |
---|---|---|---|---|
is_it_a |
let mutinput= "abc" |
is_it_a.fab(&mutinput) |
'a' |
"bc" |
这些解析器可以通过 Parser
特质中的方法进行修改。
解析器 | 输入 | 解析 | 输出 | 解析后的输入 |
---|---|---|---|---|
letparser= 'a'.fab_value(5) |
let mutinput= "abc" |
parser.fab(&mutinput) |
5 |
"bc" |
let parser = 'a'.fab_map( char::to_ascii_uppercase ) |
let mutinput= "abc" |
parser.fab(&mutinput) |
A |
"bc" |
letparser= '1'.fab_try_map(❘c❘ c.to_digit(10)) |
let mutinput= "123" |
parser.fab(&mutinput) |
1 |
"23" |
letparser= 'a'.fab_try_map(❘c❘ c.to_digit(10)) |
let mutinput= "abc" |
parser.fab(&mutinput) |
FabError(...) |
"abc" |
letparser= 'a'.fab_repeat() |
let mutinput= "aabb" |
parser.fab(&mutinput) |
vec['a','a'] |
"bb" |
letparser= 'a'.fab_repeat() |
let mutinput= "bbbb" |
parser.fab(&mutinput) |
vec[] |
"bbbb" |
letparser= 'a'.fab_repeat().as_input_slice() |
let mutinput= "aabb" |
parser.fab(&mutinput) |
"aa" |
"bb" |
letparser= 'a'.fab_repeat().min(1) |
let mutinput= "bbbb" |
parser.fab(&mutinput) |
FabError(...) |
"bbbb" |
fab_try_map 既可以与返回 Results 的函数一起使用,也可以与返回 Options 的函数一起使用。
Repeat
结构体具有用于定制的额外方法。这些包括设置要解析的项目最大数量,或输出自定义数据结构。
这些解析器可以与以下方法结合使用。
解析器 | 输入 | 解析 | 输出 | 解析后的输入 |
---|---|---|---|---|
alt('a','b') |
let mutinput= "abc" |
alt('a','b').fab(&mutinput) |
a |
"bc" |
alt('a','b') |
let mutinput= "bca" |
alt('a','b').fab(&mutinput) |
b |
"ca" |
alt('a','b') |
let mutinput= "cab" |
alt('a','b').fab(&mutinput) |
FabError(...) |
"cab" |
opt('a') |
let mutinput= "abc" |
opt('a').fab(&mutinput) |
Some('a') |
"bc" |
opt('a') |
let mutinput= "cab" |
opt('a').fab(&mutinput) |
None |
"cab" |
take_not('a') |
let mutinput= "cab" |
take_not('a').fab(&mutinput) |
'c' |
"ab" |
take_not('a') |
let mutinput= "abc" |
take_not('a').fab(&mutinput) |
FabError(...) |
"abc" |
一些代码受到Elliot Page的Winnow以及其他贡献者的启发。
依赖项
~74KB