9 次重大发布
0.10.0 | 2020年3月3日 |
---|---|
0.8.0 | 2020年3月1日 |
#132 in 解析器工具
每月 21 次下载
49KB
1.5K SLoC
Alder
警告:库处于开发中,可能会发生变化。
手写的递归下降和非回溯解析“组合器”库,考虑到良好的错误信息和无损数据。
目标
- 几乎无回溯
- 无损树生成(用于格式化和 IDE 方法)
- 支持 UTF-8
- 具有上下文的良好错误信息。
- 基于 CST 的 AST 生成(一些宏和特性魔法)
我受到了这篇帖子的启发。它是关于解析器生成器的,但我更喜欢手动编写它们。
待办事项
- 添加常见解析器中如
chomp_while
的问题解决功能 - 添加更多常见解析器
- 如果可能,移除 Arc
- 文档(目前我只有 WIP JSON 示例)
- 也许增量解析...
安装
使用 cargo-edit
cargo add alder
或手动添加
alder = "0.10.0"
您可能还想启用 derive 功能
alder = { version = "0.10.0" , features = ["derive"] }
示例
// Doc tests are treated as a test cases for snapshots.
// To enable them use `derive` feature and add `#[alder_test]` macro.
// It also supports /** multiline comments */
/// []
/// [true]
/// [true,false]
/// [ ]
/// [ true ]
/// [ true, false ]
/// [ true, false, ]
/// [trua, falsa]
/// [truadsadsa, falsa]
/// [true, false
/// [truad sadsa, falsa]
/**
[
true,
false,
"foo"
]
*/
#[alder_test]
fn array() -> impl Parser {
with_extra(
extra(),
node(Json::Array, |state| {
state.add("[");
match state.peek(1).as_ref() {
"]" => (),
_ => 'outer: loop {
state.add(value());
'inner: loop {
// Until we find either ']' or ','
match state.peek(1).as_ref() {
"]" => {
break 'outer;
}
"," => {
state.add(recover(","));
if let "]" = state.peek(1).as_ref() {
// Trailing comma
break 'outer;
}
break 'inner;
}
"" => { // EOF
state.add(raise(Problem::InvalidTokenArray, 1));
break 'outer;
}
_ => state.add(raise(Problem::InvalidTokenArray, 1)),
};
}
},
}
state.add(recover("]"));
}),
)
}
解析器应返回有关发生情况和发生位置的信息
--------------------------------- SYNTAX ERROR ---------------------------------
I was parsing Boolean when found issue:
0 |[truadsadsa, falsa]\EOF
~ | ^^^^^^^^^^ I expected `true`
--------------------------------- SYNTAX ERROR ---------------------------------
I was parsing Boolean when found issue:
0 |[truadsadsa, falsa]\EOF
~ | ^^^^^ I expected `false`
贡献
请使用 git-hooks。
cp .git-hooks/* .git/hooks/
依赖项
~2.5MB
~53K SLoC