3 个版本

使用旧的 Rust 2015

0.0.2 2018年10月31日
0.0.1 2018年9月27日
0.0.0 2018年8月18日

#311 in 解析工具


gll-macros 中使用

MIT/Apache

125KB
3.5K SLoC

GLL 解析框架

Build Status Latest Version Rust Documentation

使用方法

开始使用最简单的方法是通过 gll-macros

[dependencies]
gll = "0.0.2"
gll-macros = "0.0.2"
extern crate gll;
extern crate gll_macros;

例如,这是为类似 JSON 的语法编写的,其中使用普通标识符而不是字符串字面量作为字段名称,并允许使用括号表达式作为值

mod json_like {
    ::gll_macros::proc_macro_parser! {
        Value =
            Null:"null" |
            False:"false" |
            True:"true" |
            Literal:LITERAL |
            Array:{ "[" elems:Value* % "," "]" } |
            Object:{ "{" fields:Field* % "," "}" } |
            InterpolateRust:{ "(" TOKEN_TREE+ ")" };
        Field = name:IDENT ":" value:Value;
    }
}

您还可以使用构建脚本生成解析器(待办事项:文档化)。

使用该语法解析字符串

let tokens = string.parse().unwrap();
json_like::Value::parse_with(tokens, |parser, result| {
    let value = result.unwrap();
    // ...
});

语法

所有语法都包含一组命名规则,语法为 Name = rule;。(规则之间的顺序无关紧要)

规则由以下内容组成

  • 分组,使用 {...}
  • 字符串字面量,精确匹配输入字符/标记
  • 字符范围'a'..='d' 等同于 "a"|"b"|"c"|"d"
    • 仅在无扫描器模式下
  • 内建规则IDENTPUNCTLITERALTOKEN_TREE
    • 仅在过程宏模式下
  • 命名规则,通过其名称引用
  • 连接A B - "A 后跟 B"
  • 选择A | B - "要么 A,要么 B"
  • 可选A? - "要么 A,要么什么也没有"
  • 列表: A* - "零个或多个 A",A+ - "一个或多个 A"
    • 可选分隔符:A* % "," - "逗号分隔的 A"

规则的各个部分可以用 字段名 来标记,以便以后访问它们

LetDecl = "let" pat:Pat { "=" init:Expr }? ";"; 产生

// Note: generic parameters omitted for brevity.
struct LetDecl {
    pat: Handle<Pat>,
    init: Option<Handle<Expr>>,
}

一个Rust特定的约定是,交替字段是枚举变体。

Expr = Lit:LITERAL | Add:{ a:Expr "+" b:Expr }; 产生

enum Expr {
    Lit(Handle<LITERAL>),
    Add {
        a: Handle<Expr>,
        b: Handle<Expr>,
    },
}

许可证

许可协议为以下之一:

由您选择。

贡献

除非您明确声明,否则您提交给该crate的任何有意包含的贡献,根据Apache-2.0许可证的定义,将如上双重许可,没有任何额外的条款或条件。

依赖项

~560KB
~12K SLoC