在访问Rascal中的节点时使用模式绑定到构造函数的参数

时间:2014-11-05 19:40:44

标签: rascal

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

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())通过做几个模式匹配。我的目的是在找到特定类型的节点的同时分别将变量左右绑定到var()和标量()。我希望不要做一个嵌套的'case'语句来检索有关子节点的信息。也许这是可能的,但我不确定。

1 个答案:

答案 0 :(得分:1)

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

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

我认为leftright可能是保留关键字,因此我使用lr代替。

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

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