快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
ny] = (term~"+"~term) | (term~"-"~term) | term     def term : Parser[Any] = (factor~"*"~factor) | (factor~"/"~factor) | factor     def factor : Parser[Any] = "(" ~> expr <~ ")" | floatingPointNumber     def parse(text : String) =     {      parseAll(expr, text)     }    }    // ...   } }

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

时间:2011-01-30 Ted Neward

我已经将旧的解析器重命名为 OldAnyParser,添加左边的部分是为了便于比较;新的语法由 AnyParser 给出;注意它将 expr 定义为 term + term、term - term,或者一个独立的 term,等等。另一个大的变化是 factor 的定义,现在它使用另一种组合子 ~> 和 <~ 在遇到 ( 和 ) 字符时有效地抛出它们。

因为这只是一个临时步骤,所以我不打算创建一系列单元测试来查看各种可能性。不过我仍然想确保该语法的解析结果符合预期,所以我在这里编写一个不是很正式的测试:

清单 5. 测试解析器的非正式测试

package com.tedneward.calcdsl.test {   class CalcTest   {    import org.junit._, Assert._    // ...    _cnnew1@Test def parse =    {     import Calc._     val expressions = List(      "5",      "(5)",      "5 + 5",      "(5 + 5)",      "5 + 5 + 5",      "(5 + 5) + 5",      "(5 + 5) + (5 + 5)",      "(5 * 5) / (5 * 5)",      "5 - 5",      "5 - 5 - 5",      "(5 - 5) - 5",      "5 * 5 * 5",      "5 / 5 / 5",      "(5 / 5) / 5"     )     for (x <- expressions)      System.out.println(x + " = " + AnyParser.parse(x))    }   } }

请记住,这纯粹是出于教学目的(也许有人会说我不想为产品代码编写测试,但我确实没有在编写产品代码,所以我不需要编写正式的测试。这只是为了方便教学)。但是,运行这个测试后,得到的许多结果与标准单元测试结果文件相符,表明没有括号的表达式(5 + 5 + 5)执行失败,而有括号的表达式则会执行成功。真是不可思议!

不要忘了给解析测试加上注释。更好的方法是将该测试完全删除。这是一个临时编写的测试,而且我们都知道,真正的 Jedi 只在研究或防御时使用这些源代码,而不在这种情况中使用。

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

时间:2011-01-30 Ted Neward

清理语法

现在我们需要再次更改各种组合子的定义。回顾一下上一篇文章,expr、term 和 factor 函数中的每一个实际上都是 BNF 语句,但注意每一个函数返回的都是一个解析器泛型,参数为 Any(Scala 类型系统中一个基本的超类型,从其名称就可以知道它的作用:指示可以包含任何对象的潜在类型或引用);这表明组合子可以根据需要返回任意类型。我们已经看到,在默认情况下,解析器可以返回一个 String,也可以返回一个 List(如果您还不信的话,可以在运行的测试中加入临时测试。这也会看到同样的结果)。

要将它更改为生成 case 类 AST 层次结构的实例(Expr 对象),组合子的返回类型必须更改为 Parser[Expr]。如果让它自行更改,编译将会失败;这三个组合子知道如何获取 String,但不知道如何根据解析的内容生成 Expr 对象。为此,我们使用了另一个组合子,即 ^^ 组合子,它以一个匿名函数

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号