3

我有一个TokenStream来自 Rust 函数的定义。我想用syn::parse(和.unrwap())解析它。但是,我不知道返回类型应该是什么:

let ast: ??? = syn::parse(token_stream_from_function_definition).unwrap();

类型应该ast是什么?

4

1 回答 1

6

syn::parse函数尝试将 a 解析为期望的TokenStream任何内容。正如文档所说:

将源代码的标记解析为选定的语法树节点。

它需要一个类型参数,您通常使用类型推断来提供该参数。例如,如果您希望解析函数声明:

let fn_decl: syn::FnDecl = syn::parse(token_stream).unwrap();

如果它无法解析fn声明,这将导致恐慌。


如果您不确切知道会发生什么,那么您可以更笼统,匹配一组可能性,然后检查您发现的内容。为可以出现在相同位置的语法组提供了一些枚举。例如,如果您在希望在同一级别上找到函数声明其他一些声明的上下文中解析代码,您可能需要解析Item并匹配所有可能的项目类型:

use syn::Item;

let item: Item = syn::parse(token_stream).unwrap();
match item {
    Item::Fn(fn_decl) => {}
    Item::Mod(mod_item) => {}
    Item::Struct(struct_item) => {}
    Item::Enum(enum_item) => {}
    _ => {}
}

请注意,syn::Item有 18 个变体要匹配,并且syn::Expr有 40 个!绝对值得缩小可能性并选择最适合您需求的解析类型。您还可以考虑定义自己的类型,表示您希望找到的各种句法结构,然后syn::Parse手动实现特征。

于 2019-08-03T21:22:42.800 回答