快速业务通道

面向Java开发人员的Scala指南 - 构建计算器,第3部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
m.tedneward.calcdsl.test {   class CalcTest   {    // ...    @Test def evaluateSimpleExp =    {     val expr =      BinaryOp("^", Number(4), Number(2))     val results = Calc.evaluate(expr)     // (4 ^ 2) => 16     assertEquals(16.0, results)    }    @Test def evaluateComplexExp =    {     val expr =      BinaryOp("^",       BinaryOp("*", Number(2), Number(2)),       BinaryOp("/", Number(4), Number(2)))     val results = Calc.evaluate(expr)     // ((2 * 2) ^ (4 / 2)) => (4 ^ 2) => 16     assertEquals(16.0, results)    }   } }

面向Java开发人员的Scala指南 - 构建计算器,第3部分(7)

时间:2011-01-30 Ted Neward

运行这段代码确保可以求幂(忽略我之前提到的 bug),这样就完成了一半的工作。

最后一个更改是修改语法,让它接受新的求幂运算符;因为求幂的优先级与乘法和除法的相同,所以最简单的做法是将它放在 term 组合子中:

清单 12. 完成了,这次是真的!

package com.tedneward.calcdsl {   // ...   object Calc   {    // ...    object ExprParser extends JavaTokenParsers    {     def expr: Parser[Expr] =      (term ~ "+" ~ term) ^^ { case lhs~plus~rhs => BinaryOp("+", lhs, rhs) } |      (term ~ "-" ~ term) ^^ { case lhs~minus~rhs => BinaryOp("-", lhs, rhs) } |      term     def term: Parser[Expr] =      (factor ~ "*" ~ factor) ^^ { case lhs~times~rhs => BinaryOp("*", lhs, rhs) } |      (factor ~ "/" ~ factor) ^^ { case lhs~div~rhs => BinaryOp("/", lhs, rhs) } |      (factor ~ "^" ~ factor) ^^ { case lhs~exp~rhs => BinaryOp("^", lhs, rhs) } |      factor     def factor : Parser[Expr] =      "(" ~> expr <~ ")" |      floatingPointNumber ^^ {x => Number(x.toFloat) }     def parse(text : String) = parseAll(expr, text)    }   // ...   } }

当然,我们需要对这个解析器进行一些测试……

清单 13. 再求平方

package com.tedneward.calcdsl.test {   class CalcTest   {    // ...    @Test def parseAnExpr17 =     assertEquals(      BinaryOp("^", Number(2), Number(2)),      Calc.parse("2 ^ 2")     )    @Test def parseAnExpr18 =     assertEquals(      BinaryOp("^", Number(2), Number(2)),      Calc.parse("(2 ^ 2)")     )    @Test def parseAnExpr19 =     assertEquals(      BinaryOp("^", Number(2),       BinaryOp("+", Number(1), Number(1))),      Calc.parse("2 ^ (1 + 1)")     )    @Test def parseAnExpr20 =     assertEquals(      BinaryOp("^", Number(2), Number(2)),      Calc.parse("2 ^ (2)")     )   } }

面向Java开发人员的Scala指南 - 构建计算器,第3部分(8)

时间:2011-01-30 Ted Neward

……运行并通过后,还要进行最后一个测试,看一切是否能正常工作:

清单 14. 从 String 到平方

pac

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号