9 次重大发布

0.10.0 2020年3月3日
0.8.0 2020年3月1日

#132 in 解析器工具

每月 21 次下载

MIT 许可证

49KB
1.5K SLoC

Crates.io Docs.rs MIT License Build

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