我正在尝试对代数数据类型进行自上而下的访问。当我找到某种类型的节点时,我还想绑定到该特定节点的节点,例如
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”语句来检索有关子节点的信息。也许这是可能的,但我不确定。