【发布时间】:2017-01-21 02:49:30
【问题描述】:
我希望为初学者构建一个评估树,用于算术表达式。
我定义了以下案例类:
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)))
}
【问题讨论】:
-
我认为你不需要树类。您已经通过嵌套 Pluses 创建了一棵树
-
不是任务,是我的项目。我的解析器生成了一个嵌套树,它是初始表达式。我在帖子中画了评估树。我更新了上面的帖子,在那里我想出了只有添加的语言的解决方案。
-
我没有说任何关于作业的事情。我仍然看不到 Tree 类的优势,Plus 类本身就已经是一棵树了。
-
我在看了更多之后才明白你的意思。谢谢你的评论。