2个版本

0.1.1 2024年1月15日
0.1.0 2024年1月14日

#143 in 解析工具

MIT 协议

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: charifc=='m' {Some(5)} else {None} let mutinput= "moo" parser.fab(&mutinput) 5 "oo"
letparser=❘c: charifc=='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