dengsibao dengsibao
关注数: 13 粉丝数: 19 发帖数: 592 关注贴吧数: 8
scala程序运行错误,以下是源代码!大家帮忙看看 文件Element.scala 代码: package work import Element.elem abstract class Element { def contents: Array[String] def width: Int =contents(0).length def height: Int = contents.length def above(that: Element): Element = { val this1 = this widen that.width val that1 = that widen this.width assert(this1.width == that1.width) elem(this1.contents ++ that1.contents) } def beside(that: Element): Element = { val this1 = this heighten that.height val that1 = that heighten this.height elem ( for( (line1, line2) <- this1.contents zip that1.contents ) yield line1 + line2 ) } def widen(w:Int): Element = if(w <= width) this else{ val left = elem(' ',(w - width) / 2, height) var right = elem(' ',w - width - left.width, height) left beside this beside right } ensuring(w <= _.width) def heighten(h: Int): Element = if(h <= height) this else { val top = elem(' ',width, (h - height) / 2) var bot = elem(' ',width, h - height - top.height) top above this above bot } override def toString = contents mkString "\n" } object Element { private class ArrayElement( val contents:Array[String] ) extends Element private class LineElement(s:String) extends Element { val contents = Array(s) override def width = s.length override def height = 1 } private class UniformElement( ch:Char, override val width: Int, override val height: Int ) extends Element { private val line = ch.toString * width def contents = Array(height.toString,line) } def elem(contents: Array[String]): Element = new ArrayElement(contents) def elem(chr:Char, width: Int, height: Int): Element = new UniformElement(chr, width, height) def elem(line: String): Element = new LineElement(line) } 文件stairway.scala 代码: package work import work.Element._ sealed abstract class Expr case class Var(name:String) extends Expr case class Number(num:Double) extends Expr case class UnOp(operator:String, arg:Expr) extends Expr case class BinOp(operator:String, left:Expr, right:Expr) extends Expr import work._ class ExprFormatter { private val opGroups = Array( Set("|", "||"), Set("&", "&&"), Set("^"), Set("==", "!="), Set("<", "<=", ">", ">="), Set("+", "-"), Set("*", "%") ) private val precedence = { val assocs = for { i <- 0 until opGroups.length op <- opGroups(i) } yield op -> i Map( ) ++ assocs } private val unaryPrecedence = opGroups.length private val fractionPrecedence = -1 private def format(e:Expr, enclPrec:Int): Element = e match { case Var(name) => elem(name) case Number(num) => def stripDot(s:String) = if (s endsWith ".0") s.substring(0, s.length - 2) else s elem(stripDot(num.toString)) case UnOp(op,arg) => elem(op) beside format(arg, unaryPrecedence) case BinOp("/", left, right) => val top = format(left, fractionPrecedence) val bot = format(right, fractionPrecedence) val line = elem('-', top.width max bot.width, 1) val frac = top above line above bot if (enclPrec != fractionPrecedence) frac else elem(" ") beside frac beside elem (" ") case BinOp(op, left, right) => val opPrec = precedence(op) val l = format(left, opPrec) val r = format(right, opPrec + 1) val oper = l beside elem(" " + op + " ") beside r if (enclPrec <= opPrec) oper else elem("(") beside oper beside elem(")") } def format(e:Expr):Element = format(e, 0) } 文件Express.scala 代码: package work object Express { def main(args:Array[String]){ val f = new ExprFormatter val e1 = BinOp("*", BinOp("/", Number(1), Number(2)), BinOp("+", Var("x"), Number(1))) val e2 = BinOp("+", BinOp("/", Var("x"), Number(2)), BinOp("/", Number(1.5), Var("x"))) val e3 = BinOp("/", e1, e2) def show(e:Expr) = println(f.format(e) + "\n\n") for( e <- Array(e1, e2, e3)) show(e) } } 在eclipse 中运行,出现异常: Exception in thread "main" java.lang.StackOverflowError at java.lang.reflect.Array.newArray(Native Method) at java.lang.reflect.Array.newInstance(Unknown Source) at scala.reflect.ClassTag$class.newArray(ClassTag.scala:62) at scala.reflect.ClassTag$$anon$1.newArray(ClassTag.scala:144) at scala.collection.mutable.ArrayBuilder$ofRef.mkArray(ArrayBuilder.scala:64) at scala.collection.mutable.ArrayBuilder$ofRef.resize(ArrayBuilder.scala:70) at scala.collection.mutable.ArrayBuilder$ofRef.ensureSize(ArrayBuilder.scala:82) at scala.collection.mutable.ArrayBuilder$ofRef.$plus$eq(ArrayBuilder.scala:87) at scala.collection.mutable.ArrayBuilder$ofRef.$plus$eq(ArrayBuilder.scala:57) at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:722) at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108) at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:721) at work.Element.beside(Element.scala:22) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) at work.Element.above(Element.scala:11) at work.Element.heighten(Element.scala:39) at work.Element.beside(Element.scala:18) at work.Element.widen(Element.scala:31) ··················
1 下一页