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

MIT/Apache

23KB
473 代码行

LALRPOP解析器,用于过程宏输入

github build status

此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处理。特别是,Synproc-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.0MIT许可证下许可。
除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在此crate中的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~0–1.9MB
~26K SLoC