#lexer #syn #macro #parser #tokenizer

absolution

‘摆脱 syn 的束缚’。一个轻量级的Rust词法分析器,专为用于感叹号风格的过程宏设计。

3个不稳定版本

0.1.1 2020年3月20日
0.1.0 2020年3月20日
0.0.1 2020年3月13日

1399过程宏

每月 31 次下载
2 个crate中使用(通过 slip-imp

MIT/Apache

36KB
928

absolution

Build Status License: MIT/Apache-2.0

"摆脱 syn 的束缚"

此crate提供了一种可内省的token树表示,用于编写Rust过程宏。它仍然有些不稳定:它是可用的,但我还没有完全决定API的形状,可能会发布破坏性变更。我欢迎各种反馈!

proc-macro2 crate提供了一个token树表示,但是由于向后兼容性的原因,这种表示并不易于内省,您需要进一步解析才能使用它。例如,Literal 类型实际上没有提供有关包含的文本的任何其他信息,只说明它是一个文本。

通常,如果人们想要进一步内省代码,会引入令人惊叹的 syn crate;syn 将Rust代码解析为完整的、易于内省的AST,便于工作。当编写自定义derives时,您的过程宏将应用于某些Rust项,这是非常棒的。

然而,像 format!() 这样的感叹号风格的过程宏通常不需要内省Rust AST,它们只需要查看tokens。例如,一个非常简单的 format!() 实现只需要能够读取初始格式字符串,然后获取参数的逗号分隔的token树。为此在依赖树中引入整个Rust解析器有些过度。

absolution 提供了一种类似于 proc-macro2 的可内省token树表示,用于设计感叹号风格的过程宏。

目前,proc-macro-hack crate仍然依赖于 syn 来工作,因此这个crate目前对任何属性风格的过程宏都没有用。

使用方法,只需使用 Into 将从 proc_macroproc_macro2 标记流转换为 absolution 流,使用 quote! 进行反向转换。

extern crate proc_macro;
use absolution::{Ident, LitKind, Literal, TokenStream, TokenTree};
use quote::quote;

#[proc_macro]
pub fn make_func(tt: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let stream: TokenStream = tt.into();
    let first_token = &stream.tokens[0];
    let s = if let TokenTree::Literal(Literal {
        kind: LitKind::Str(s),
        ..
    }) = &first_token
    {
        s
    } else {
        panic!("Must start with a string!")
    };

    let ident = Ident {
        ident: s.to_string(),
        span: first_token.span(),
    };

    quote!(
        fn #ident() -> &'static str {
            #first_token
        }
    )
    .into()
}

更多示例,请参阅 examples/string-enum

许可证

根据您的选择,可在 Apache License, Version 2.0MIT 许可证 下获得许可。
除非您明确表示,否则您提交的任何有意包含在此包中的贡献,如 Apache-2.0 许可证所定义,应按上述方式双重许可,而不附加任何额外的条款或条件。

依赖项

~80KB