scala 解析

来源:互联网 发布:淘宝客服售前售后要点 编辑:程序博客网 时间:2024/05/22 12:49

在看github的给的快学scala第19章的第一题答案时候,发现给出的代码有错误,现将错误代码与自己给出的修改黏贴如下:

原始代码:https://github.com/BasileDuPlessis/scala-for-the-impatient/blob/master/src/main/scala/com/basile/scala/ch19/Ex01.scala

class ExprParser extends RegexParsers {    val number = "[0-9.]+".r    def expr: Parser[Double] = term ~ opt(("+" | "-") ~ expr) ^^ {      case t ~ None => t      case t ~ Some("+" ~ e) => t + e      case t ~ Some("-" ~ e) => t - e    }    def term: Parser[Double] = factor ~ opt(("/" | "*" | "%") ~ term) ^^ {      case f ~ None => f      case f ~ Some("/" ~ e) => f / e      case f ~ Some("*" ~ e) => f * e      case f ~ Some("%" ~ e) => f % e    }    def factor: Parser[Double] = number ^^ {_.toDouble} | "(" ~> expr <~ ")"  }

修改后的代码:


class ExprParser extends RegexParsers with PackratParsers{    val number = "[0-9.]+".r   def expr: Parser[Double] = opt("+" | "-") ~term ~ rep(("+" | "-") ~term^^{      case "+" ~ t => t      case "-" ~ t => -t}) ^^ {      case (None|Some("+")) ~ t ~ r => t + r.sum      case Some("-") ~ t ~ r => -t + r.sum    }   def term: Parser[Double] = factor ~ opt(("/" | "*" | "%") ~ term) ^^ {      case f ~ None => f      case f ~ Some("/" ~ e) => f / e      case f ~ Some("*" ~ e) => f * e      case f ~ Some("%" ~ e) => f % e    }    def factor: Parser[Double] = number ^^ {_.toDouble} | "(" ~> expr <~ ")"  }  val parser = new ExprParser  val result = parser.parseAll(parser.expr,"-5-4-5/(1+3%1)-5-4*2")  if (result.successful) println(result.get)


0 0
原创粉丝点击