#parser-combinator #combinator #elm #parser #error-message

alder-derive

受 Elm 解析器错误信息启发的解析器组合库

6 个版本

0.2.3 2020年2月25日
0.2.2 2020年2月24日
0.1.1 2020年2月20日

#elm中排名31


用于alder

MIT许可证

12KB
297

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/

依赖项

~2MB
~42K SLoC