8个版本
0.0.8 | 2022年12月19日 |
---|---|
0.0.7 | 2020年12月27日 |
0.0.6 | 2020年6月14日 |
0.0.5 | 2019年4月30日 |
0.0.1 | 2018年1月12日 |
#8 in #lalrpop
23KB
473 代码行
LALRPOP解析器,用于过程宏输入
此crate展示了使用LALRPOP解析器生成器框架来解析Rust过程宏中的输入标记的概念验证。
宏
此示例中的过程宏是s_expr!
和s_type!
,它们扩展为字符串字面量S表达式表示形式,表示输入中给出的Rust表达式或类型。
use lalrproc::{s_expr, s_type};
fn main() {
// Expands to "(+ (* 1 2) (* 3 4))"
let e = s_expr!(1 * 2 + 3 * 4);
// Expands to "(Reference 'a mut (Path module T))"
let t = s_type!(&'a mut module::T);
}
解析器
输入解析完全由LALRPOP处理。特别是,Syn和proc-macro2没有参与。
LALRPOP的所有功能都可用于LALRPOP语法。例如,以下是一个表达式语法的子集,说明了如何将类似1 * 2 + 3 * 4
的内容解析到语法树(+ (* 1 2) (* 3 4))
。
pub Expr: Box<Expr> = {
Expr ExprOp Factor => Box::new(Expr::Binary(<>)),
Factor,
};
ExprOp: BinOp = {
"+" => BinOp::Add,
"-" => BinOp::Sub,
};
Factor: Box<Expr> = {
Factor FactorOp Component => Box::new(Expr::Binary(<>)),
Component,
};
FactorOp: BinOp = {
"*" => BinOp::Mul,
"/" => BinOp::Div,
};
Component: Box<Expr> = {
Literal => Box::new(Expr::Lit(<>)),
Path => Box::new(Expr::Path(<>)),
"(" <Expr> ")",
};
错误报告
如果输入不符合过程宏期望的语法,LALRPOP的错误将以一种方式呈现,指示问题标记,并给出在该位置语法可以接受的标记。
error: failed to parse macro input
--> tests/test.rs:17:25
|
17 | let e = s_expr!(1 + : / 2);
| ^
|
= note: unrecognized token `:`
= note: expected one of `(`, identifier, or literal
许可证
根据您的选择,在Apache License, Version 2.0或MIT许可证下许可。除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在此crate中的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。
依赖关系
~0–1.9MB
~26K SLoC