【发布时间】:2015-02-05 17:25:08
【问题描述】:
我有以下 AST 定义:
data Exp =
app(Exp fun, Exp body)
| var(str name)
| nat(int nat)
| func(list[str] formal, Exp body)
| cond(Exp cond, Exp then, list[tuple[Exp,Exp]] elifs, Exp otherwise)
| let(list[str] vars, list[Exp] exps, Exp body)
| seq(Exp lhs, Exp rhs)
| mul(Exp lhs, Exp rhs)
| div(Exp lhs, Exp rhs)
| md(Exp lhs, Exp rhs)
| add(Exp lhs, Exp rhs)
| sub(Exp lhs, Exp rhs)
| eq(Exp lhs, Exp rhs)
| gt(Exp lhs, Exp rhs)
| lt(Exp lhs, Exp rhs)
| geq(Exp lhs, Exp rhs)
| leq(Exp lhs, Exp rhs)
;
我正在尝试在 switch 语句中匹配树的一个节点,以便我可以访问每个孩子。我尝试过的事情是:
private str synthesise_f(Core::AST::Exp exp) {
switch (exp) {
case \Exp(_, _): {
println("EXP_,_!");
}
}
}
和
private str synthesise_f(Core::AST::Exp exp) {
switch (exp) {
case /Exp(_, _): {
println("EXP_,_!");
}
}
}
和
private str synthesise_f(Core::AST::Exp exp) {
switch (exp) {
case "Exp"(_, _): {
println("EXP_,_!");
}
}
}
和 私有 str 综合_f(Core::AST::Exp exp){ 案例 \adt(,): { println("EXP_!"); } }
最后一个确实有效......但没有让我访问节点的子节点。如果我打印出switch 语句中使用的exp,我会得到:
seq(var("x"),var("y"))
(已删除评论和位置)
我想知道如何匹配这些节点,然后访问它们的子节点。
谢谢!
【问题讨论】:
标签: pattern-matching abstract-syntax-tree rascal