7 个版本
0.1.5 | 2021 年 1 月 8 日 |
---|---|
0.1.4 | 2020 年 3 月 17 日 |
0.1.3 | 2019 年 8 月 21 日 |
0.1.2 | 2019 年 7 月 12 日 |
0.0.1 | 2019 年 6 月 12 日 |
#8 in #lemon
11,687 每月下载量
在 15 个crate中使用(通过 pomelo)
130KB
2.5K SLoC
pomelo
一个用于创建类似 Lemon 解析器的过程宏。
Pomelo 是 Lemon 解析器生成器(从现在起称为 Lemon_C)的 Rust 版本,最初由 D. Richard Hipp 为其 SQLite 解析器编写。它基于将 Lemon 移植到 Rust 的早期尝试(Lemon_Rust),但现在它是一个 Rust 过程宏,因此不包含任何原始 C 代码(尽管它使用了相同的算法)。因此,名称改为另一种柑橘类水果。
入门指南
建议前往 crates.io 查找最新版本,以及文档的最新构建链接。
只需在您的 Cargo 清单中添加以下依赖项
[dependencies]
pomelo = "*"
示例
use pomelo::pomelo;
pomelo! {
%type input Vec<i32>;
%type numbers Vec<i32>;
%type Number i32;
input ::= numbers?(A) { A.unwrap_or_else(Vec::new) };
numbers ::= Number(N) { vec![N] }
numbers ::= numbers(mut L) Comma Number(N) { L.push(N); L }
}
fn main() -> Result<(), ()> {
use parser::{Parser, Token};
//Real world code would use a tokenizer
let tokens = vec![
Token::Number(1),
Token::Comma,
Token::Number(2),
Token::Comma,
Token::Number(3),
];
let mut p = Parser::new();
for tok in tokens.into_iter() {
p.parse(tok)?;
}
let data = p.end_of_input()?;
assert_eq!(data, vec![1, 2, 3]);
Ok(())
}
在 github 仓库文件夹 中查看更多示例。
许可
根据您的选择,受以下任一许可协议约束
- Apache License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则任何有意提交以供包括在您的工作中的贡献,根据 Apache-2.0 许可证定义,应作为上述双重许可发布,不附加任何额外条款或条件。
依赖项
~1.5MB
~36K SLoC