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 ステートメントで私がやろうとしているのは、特定の種類のノードを検索することです。つまり、2 つのパターン マッチを実行して、型 assign(var( ),scalar( )) を検索します。私の意図は、特定の種類のノードを見つけると同時に、左と右の変数をそれぞれ 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>");
}

andは予約済みのキーワードleftrightある可能性があるため、代わりにlandを使用しrました。

または、より単純です (ネストされたパターンの名前は必要ないため:

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