评估树

时间:2017-01-20 18:06:25

标签: scala tree

我希望为初学者构建一个评估树,用于算术表达式。

我定义了以下案例类:

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)))
}

1 个答案:

答案 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

的任何地方使用它