在rustc_ast中,如何匹配TokenStream(一个抽象的令牌序列)

u2nhd7ah  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(144)

我用rustc_ast::tokenstream::TokenStream工作
我在console中打印了TokenStream:

Contents of value2.tokens: TokenStream(
    [
        Token(
            Token {
                kind: Ident(
                    "dead_code",
                    false,
                ),
                span: src/main.rs:12:9: 12:18 (#0),
            },
            Alone,
        ),
    ],
)

我需要在这个TokenStream上进行匹配,以确保我们处理的是“dead_code”属性符号(而不是其他符号)
下面是一段代码,我正在处理AST并试图匹配TokenStream,请注意代码中的注解,我卡住了 //这个匹配不正确,如何在这里匹配?

for attr in tcx.get_attrs(item.owner_id.to_def_id(), sym::allow) {
                println!("Print attributes: {:#?}", attr);
                if let AttrKind::Normal(value) = &attr.kind {
                    if let AttrArgs::Delimited(value2) = &value.item.args {
                        if let value3 = &value2.tokens {
                            println!("Contents of value2.tokens: {:#?}", value3);
                            match value3 {
                                [a] => { // THIS MATCH IS NOT CORRECT, HOW TO MATCH HERE?
                                    println!("hi, {}", a)
                                }
                            }
                        }
                    }
                }
            }

我试图匹配这个TokenStream的内部作为元组,枚举,列表...一切都行不通我的脸总是不匹配。
我尝试使用这个解析器,但失败了,因为它的复杂性。
那么,如何匹配一个抽象的令牌序列TokenStream呢?

gab6jxml

gab6jxml1#

我刚刚做到了!
方法树()帮助了我。然后应该使用look_ahead函数
这是解决方案代码:

for attr in tcx.get_attrs(item.owner_id.to_def_id(), sym::allow) {
                println!("Print attributes: {:#?}", attr);
                if let AttrKind::Normal(value) = &attr.kind {
                    if let AttrArgs::Delimited(value2) = &value.item.args {
                        if let value3 = &value2.tokens {
                            println!("Contents of value2.tokens (my TokenStream): {:#?}", value3);
                            let into_trees = &value3.trees();
                            let continue_try = into_trees.look_ahead(0);
                            match continue_try {
                                Some(res) => {
                                    if let rustc_ast::tokenstream::TokenTree::Token(res2, _) = res {
                                        if let rustc_ast::token::TokenKind::Ident(a, _) = res2.kind
                                        {
                                            println!("Result here! {:#?}", a.as_str())
                                        }
                                    }
                                }
                                _ => println!("Ain't special"),
                            }
                        }
                    }
                }
            }

相关问题