快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
t;=''9'';   } }

解析单位数字的解析器 digit 定义如下:

Parser digit = new SAT(new IsDigit(), new  Item());

我们可以采用同样的方法组合出单个字母、单个大写 字母、单个小写字母等解析器来。

接下来,我们定义一个 OR 组合子, 其接收两个解析器,并分别用这两个解析器去解析一个目标串,只要有一个解析 成功,就认为解析成功,如果两个都失败,则认为失败,代码定义如下:

class OR implements Parser  {   private  Parser p1;   private Parser p2;   public OR (Parser p1, Parser p2) {     this.p1 = p1;      this.p2 = p2;   }   public Result parse (String target) {     Result r = p1.parse(target);     return r.is_succeeded() ? r : p2.parse(target);    } }

我们可以定义出一个新的解析器 digit_or_alpha,如 果目标字符是数字或者字母那么该解析器就解析成功,否则就失败。代码如下:

判断是否是字母的条件谓词:

class IsAlpha  implements Predicate {   public boolean satisfy(String  value) {     char c = value.charAt(0);      return (c>=''a'' && c<=''z'') || (c>=''A'' &&  c<=''Z'');   } }

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

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

用于解析单个字母的解析器 :

Parser alpha = new SAT(new IsAlpha(), new Item ());

digit_or_alpha 解析器定义:

Parser  digit_or_alpha = new OR(digit, alpha);

下面我们来定义 一个 顺序组合子 SEQ,该组合子接收两个解析器,先把第一个解析器应用到目 标字符串,如果成功,就把第二个解析器应用到第一个解析器识别后剩余的字符 串上,如果这两个解析器都解析成功,那么由 SEQ 组合起来的这个复合解析器 就解析成功,只要有一个失败,复合解析器就解析失败。当解析成功时,其识别 结果由这两个解析器的识别结果连接而成。

为了能够连接两个 Result 中已经识别出来的解析结果,我们在 Result 类中新增一个静态方法:concat, 其定义如下:

public static Result concat(Result r1,  Result r2) {   return new Result(      r1.get_recognized().concat(r2.get_recognized()),      r2.get_remaining(), true); }

顺序组合子 SEQ 的定义 如下:

class SEQ implements Parser  {    private Parser p1;   private Parser p2;    public SEQ(Parser p1, Parser p2) {     this.p1 =  p1;     this.p2 = p2;   }   public Result  parse(String target) {     Result r1 = p1.parse (target);     if(r1.is_succeeded()) {        Result r2 = p2.parse(r1.get_remaining());       if (r2.is_succeeded()) {         return Result.concat (r1,r2);    }    }    return Result.fail ();  }  }

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

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

现在,如果我们想定义一个解析器用以 识别第一个是字母,接下来是一个数字的情况,就可以这样定义:

Parser alpha_before_digit = new SEQ(alpha,  digit);

接下来我们定义本文中的最后一个组合子:OneOrMany。 该组合子接收一个解析器和一个正整数值,其生成的复合解析器会用原始解析器 连续地对目标串进行解析,每一次解析时的输入为上一次解析后剩余的字符串, 解析的最大次数由输入的正整数值决定。如果第一次解析就失败,那么该复合解 析器就解析失败,否则的话,会一

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