6 个版本
0.2.3 | 2020年2月25日 |
---|---|
0.2.2 | 2020年2月24日 |
0.1.1 | 2020年2月20日 |
在#elm中排名31
用于alder
12KB
297 行
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/
依赖项
~2MB
~42K SLoC