<<快学Scala>> 第十九章 练习8 答案

来源:互联网 发布:阿里云数据库连接工具 编辑:程序博客网 时间:2024/09/21 09:19

package mucao.com

import scala.util.parsing.combinator.RegexParsers
import scala.collection.mutable.HashMap

object Calculator extends App{
var stop=false
var vars=new HashMapString,Int
println(“计算器:”)
var str=readLine().trim()
if(str.equals(“quit”))
stop=true
val parser=new ExprParser()
var result=parser.parseAll(parser.expr, str)
while(!stop){
if(str.matches(“^out\s*=\s*\w+”))
{
val key=str.split(“=”)(1)
result=parser.parseAll(parser.expr,key)
if(result.successful)
println(key+”=”+result.get)
else
println(“error!”)
}else{
result=parser.parseAll(parser.expr, str)
if(result.successful)
println(“=”+result.get)
else
println(“error!”)
}
str=readLine().trim()
if(str.equals(“quit”))
{
stop=true
println(“退出计算器!”)
}

}

}

class ExprParser extends RegexParsers {
val vars=new HashMapString,Int
val number=”-?[0-9]+”.r
val ident=”\w+”.r
def expr: Parser[Int] = term ~ rep((“+” | “-“) ~ term ^^ {
case “+” ~ t => t
case “-” ~ t => -t
}) ^^ {case t ~ r => t+r.sum}
def term: Parser[Int] = factor ~ rep((“*” | “/” | “%”) ~ factor ) ^^ {
case f ~ list => list.foldLeft(f)((a,b) => b._1 match {
case “” => a b._2
case “/” => a / b._2
case “%” => a % b._2
})
}
def factor: Parser[Int] = inner ~ rep(“^” ~> inner) ^^ {
case e ~ Nil => e
case e ~ list => math.pow(e,list.reduceRight((a,b) => math.pow(a,b).toInt)).toInt
}
def inner: Parser[Int] = number ^^ {_.toInt} | “(” ~> expr <~ “)” | variable

def variable: Parser[Int] = ident ~ opt("=" ~> expr) ^^ {    case v ~ None => vars.get(v).getOrElse(0)    case v ~ Some(r) => vars += v -> r ; r}

}

*测试**
计算器:
s
=0
s+r
=0
s=10
=10
e=8
=8
s+e
=18
h=s+e
=18
out=h
h=18

在网上搜索了好久,《快学Scala》第十八章以后的就基本没有练习题的答案了。好不容易找到一个第十九章的答案,发现练习8,9,10没有答案。最后决定自己写。
熬了一个下午终于做出来了这道题。。
如果有什么错误的地方,或者发现有哪些地方可以改进,再或者有更好的方案的话,都欢迎大家提出来,一起交流,一起学习。。
(也不知道会不会有人看 。。。。。)

0 0
原创粉丝点击