<<快学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
}
*测试**
计算器:
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没有答案。最后决定自己写。
熬了一个下午终于做出来了这道题。。
如果有什么错误的地方,或者发现有哪些地方可以改进,再或者有更好的方案的话,都欢迎大家提出来,一起交流,一起学习。。
(也不知道会不会有人看 。。。。。)
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没有答案。最后决定自己写。
熬了一个下午终于做出来了这道题。。
如果有什么错误的地方,或者发现有哪些地方可以改进,再或者有更好的方案的话,都欢迎大家提出来,一起交流,一起学习。。
(也不知道会不会有人看 。。。。。)
相关文章推荐
- 机器学习基石第五讲:training versus testing
- 冲刺第三天
- hdu-5672 String(尺取法)
- Redis的安装-Redis学习笔记一
- 自定义组件使用总结
- 二、TypeScript 基本数据类型
- 源代码管理的基本操作
- POJ 3421
- Swift之分支
- 【USACO题库】4.1.1 Beef McNuggets麦香牛块
- Yii2系列教程七:Behaviors And Validations
- yum安装实现lamp分离及Xcache加速
- UVA - 10055 Hashmat the Brave Warrior
- 14.spark RDD深度解析
- 我的第一个调试器
- 个人进度03
- Yii2系列教程六:集成编辑器
- Android之TabHost布局
- OSX下brew cask install 本地安装pkg,dmg
- 薛老师软考高项学员:2016年4月13日作业