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 中使用
125KB
3.5K SLoC
GLL 解析框架
使用方法
开始使用最简单的方法是通过 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"
- 仅在无扫描器模式下
- 内建规则:
IDENT
、PUNCT
、LITERAL
、TOKEN_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>,
},
}
许可证
许可协议为以下之一:
- Apache许可证第2版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您提交给该crate的任何有意包含的贡献,根据Apache-2.0许可证的定义,将如上双重许可,没有任何额外的条款或条件。
依赖项
~560KB
~12K SLoC