在编译器中对AST结构进行模式匹配

Tyl*_*den 3 pattern-matching rust

所以我试图在结构上进行模式匹配.这个特殊的结构由许多枚举构成,这些枚举包含指向枚举的指针,或者在最基本的层次上,是一个未签名的8字节向量.我想使用矢量,但是想知道是否可以模式匹配我的方式与vec.

ast::ExprUnary(ast::UnDeref, ref exprs) =>{
        let pat = match exprs.node {

            ast::ExprLit(ast::Lit(codemap::Spanned(ast::LitBinary(string),innerspan))) => {
                 //stuff to string
                 //primary issue here is that these enums, which ExprLit is 
                 //comprised of, do not pattern match correctly
            }
            _ => //other stuff
        };
Run Code Online (Sandbox Code Playgroud)

在编译此代码时,我收到以下两个错误,

unresolved enum variant, struct or const `Spanned`
unresolved enum variant, struct or const `Lit`
Run Code Online (Sandbox Code Playgroud)

这两个枚举都存在于ast中,但是,我不知道为什么它们在这个特定的上下文中是未解决的.任何意见,将不胜感激

oli*_*obk 7

有些事情在这里出错了.

  1. ast::Lit只是一个类型别名codemap::Spanned,而不是枚举或枚举变体.因此您不需要同时指定两者,但必须指定其中之一.
  2. ast::ExprLit是一个包含a的枚举变体P<Lit>.所以你需要P通过使用来解构P(inner)
    • 至少我记得这样做 - 结构化P.文档说不然.如果它不起作用,您需要取消引用它并为内容添加另一个内部匹配
  3. codemap::Spanned 是一个结构,而不是一个元组结构,这意味着你不能按位置匹配它的字段,但你必须按名称对字段进行解构,如下所示:

    let codemap::Spanned {
        node: innernode,
        span: innerspan,
    } = some_spanned;
    
    Run Code Online (Sandbox Code Playgroud)

总的来说,我相信你的比赛看起来应该是符合的

let pat = match exprs.node {
    ast::ExprLit( P( codemap::Spanned {
        node: ast::LitBinary(string),
        span: innerspan,
    })) => {
        //stuff to string
        //primary issue here is that these enums, which ExprLit is 
        //comprised of, do not pattern match correctly
    }
    _ => { //other stuff }
};
Run Code Online (Sandbox Code Playgroud)