我希望为初学者构建一个评估树,用于算术表达式。
我定义了以下案例类:
abstract class Expr
case class Num(n: Integer) extends Expr
case class Plus(e1: Expr, e2: Expr) extends Expr
我的解析器,当它看到表达式1 + 1 + 1时会生成以下树:
Plus(Plus(Num(1), Num(1)), Num(1))
然后我定义了以下数据类型:
case class Tree[Expr](e: Expr, children: List[Tree[Expr]])
这是一个绘制得很糟糕的评估树:
Num(1) Num(1)
----------------------------
Plus(Num(1), Num(1)) Num(1)
---------------------------------------
Plus(Plus(Num(1),Num(1)), Num(1))
我想建立一个表示它的树数据结构。因此,评估结果将是:
Tree(
Plus(Plus(Num(1), Num(1)), Num(1)),
List(Tree(Plus(Num(1),Num(1),
List(Tree(Num(1), List()),
Tree(Num(1), List()))),
Tree(Num(1), List())))
我想要一个方法eval:
def eval(e: Expr, t: Tree[Expr]): Tree[Expr] = (e, t) match {
// Do the matching on Num
case Num(n) ........ =>
case Plus(e1, e2) ...... =>
}
这是表示此评估树的正确方法吗?如果是,我该如何创建这样的嵌套树数据结构。
编辑:这是一个仅用于添加的方法eval
def eval(e: Expr): Tree[Expr] = e match {
case Num(n) => Tree(Num(n), Nil)
case Plus(e1, e2) => Tree(Plus(e1, e2), List(eval(e1), eval(e2)))
}
答案 0 :(得分:2)
你可能会这样:
def toTree(e: Expr): Tree[Expr] = e match {
case Plus(e1, e2) => Tree(e, List(eval(e1), eval(e2)))
case _ => Tree(e, List())
}
但是,你最好省略Tree
,因为@puhlen建议。以下方法应该足够了:
def children(e: Expr): List[Expr] = e match {
case Plus(e1, e2) => List(e1, e2)
case _ => List()
}
只要在使用Tree.children