我正在尝试自上而下访问代数数据类型。当我找到某种类型的节点时,我也想绑定到该特定节点的节点,例如。
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'语句来检索有关子节点的信息。也许这是可能的,但我不确定。
答案 0 :(得分:1)
您可以嵌套模式,如下所示:
top-down visit(myScript) {
case e:assign(l:var(varName),r:scalar(aType)) :
// do something useful
println("<varName> : <aType>");
}
我认为left
和right
可能是保留关键字,因此我使用l
和r
代替。
或更简单(因为您不需要嵌套模式的名称:
top-down visit(myScript) {
case assign(var(varName),scalar(aType)) :
// do something useful
println("<varName> : <aType>");
}