您的位置:首页 > 其它

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

2016-04-22 22:40 302 查看
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没有答案。最后决定自己写。

熬了一个下午终于做出来了这道题。。

如果有什么错误的地方,或者发现有哪些地方可以改进,再或者有更好的方案的话,都欢迎大家提出来,一起交流,一起学习。。

(也不知道会不会有人看 。。。。。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: