快速业务通道

利用Java实现组合式解析器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
{     this.recognized = recognized;     this.remaining = remaining;     this.succeeded =  succeeded;   }   public boolean is_succeeded()  {     return succeeded;   }   public  String get_recognized() {     return recognized;    }   public String get_remaining() {      return remaining;   }   public static Result  succeed(String recognized,     String remaining) {      return new Result(recognized, remaining, true);   }   public static Result fail() {     return  new Result("", "", false);   } }

利用Java实现组合式解析器(3)

时间:2011-09-09 ibm 孙鸣 邓辉

其中, recognized 字段表示这个解析器所认识的部分,remaining 表示经过这个解析 器解析后所剩余的部分,succeeded 表示解析是否成功,Result 是一个值对象 。有了解析器的精确定义,接下来我们就可以定义出最简单的解析器。显然,最 简单的解析器就是什么也不解析的解析器,把目标字符串原样返回,我们称其为 Zero,定义如下:

class Zero implements Parser  {   public Result parse(String target) {      return Result.succeed("", target);   } }

Zero 解析器一定会解析成功,不做任何语法单位识别并直接返 回目标字符串。下面我们来定义另外一个很简单的解析器 Item,只要目标字符 串不为空,Item 就会把目标字符串的第一个字符作为其识别结果,并返回成功 ,如果目标字符串为空,就返回失败,Item 的定义如下:

class  Item implements Parser  {   public Result parse (String target) {     if(target.length() > 0) {       return Result.succeed(target.substring(0,1),          target.substring(1));     }     return  Result.fail();   } }

Zero 和 Item 是我们解析 器 DSL 中仅有的两个原子,在下一小节中,我们来定义解析器的组合方法。

解析器组合子

我们在上一小节中定义了 Item 解析器,它无条件 的解析出目标字符串中的第一个字符,如果我们希望能够变成有条件的解析,就 可以定义出一个 SAT 组合子,其接收一个条件谓词(predicate)和一个解析器 ,并生成一个复合解析器,该复合解析器能否解析成功取决于原始解析器的解析 结果是否满足给定的条件谓词,条件谓词和 SAT 的定义如下:

interface Predicate {   public boolean  satisfy(String value); } class SAT implements  Parser  {   private Predicate pre;   private  Parser  parser;   public SAT(Predicate predicate,  Parser parser) {     this.pre = predicate;      this.parser = parser;   }   public Result  parse(String target) {     Result r = parser.parse (target);     if(r.is_succeeded() && pre.satisfy (r.get_recognized())) {       return r;     }     return Result.fail();   } }

利用Java实现组合式解析器(4)

时间:2011-09-09 ibm 孙鸣 邓辉

如果, 我们想定义一个解析单个数字的解析器,那么就可以定义一个 IsDigit 条件谓 词,并通过 SAT 把该 IsDigit 和 Item 组合起来,代码如下:

class IsDigit implements Predicate {    public boolean satisfy(String value) {     char c =  value.charAt(0);     return c>=''0'' &&  c&l

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