2

我正在尝试对代数数据类型进行自上而下的访问。当我找到某种类型的节点时,我还想绑定到该特定节点的节点,例如

data Script=script(list[Stmt] body | ...
data Stmt  =exprstmt(Expr expr)| ...
data Expr  =assign(Expr left, Expr right) | var(str name)| scalar(Type aType)|... ;


Script myScript=someScript(srcFile);
top-down visit(myScript)
{
    case (Expr e:assign(left,right), left:=var(_), right :=scalar(_) )
    {
        str varName=left.name;
        Type myType=right.aType;
    }
}

所以我在case语句中试图做的是通过做几个模式匹配来搜索特定类型的节点:即类型assign(var( ),scalar( ))。我的意图是在找到特定类型的节点的同时将变量 left 和 right 分别绑定到 var( ) 和 scalar( )。我希望不要执行嵌套的“case”语句来检索有关子节点的信息。也许这是可能的,但我不确定。

4

1 回答 1

2

您可以嵌套模式,如下所示:

top-down visit(myScript) {
    case e:assign(l:var(varName),r:scalar(aType)) :
      // do something useful
      println("<varName> : <aType>");
}

我相信left并且right可能是保留关键字,所以这就是我使用land的原因r

或更简单(因为您不需要嵌套模式的名称:

top-down visit(myScript) {
    case assign(var(varName),scalar(aType)) :
      // do something useful
      println("<varName> : <aType>");
}
于 2014-11-05T20:03:01.443 回答