快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
直解析到最大次数或者遇到解析失败为止,并 把所有成功的解析的识别结果连接起来作为复合解析器的识别结果,OneOrMany 组合子的定义如下:

class OneOrMany implements Parser  {   private int max;   private Parser  parser;   public OneOrMany(int max, Parser parser)  {     this.max = max;     this.parser =  parser;   }  public Result parse(String target)  {     Result r = parser.parse(target);      return r.is_succeeded() ? parse2(r,1) : Result.fail();  }  private Result parse2(Result pre, int count) {     if(count >= max) return pre;     Result r  = parser.parse(pre.get_remaining());     return  r.is_succeeded() ?        parse2(Result.concat (pre,r),count+1) : pre;   }  }

使用该组合 子,我们可以容易地定义出用于识别由最少一个,最多 10 个字母组成的串的解 析器,如下:

Parser one_to_ten_alpha = new OneOrMany (10,alpha);

本文的组合子就定义到此,不过读者可以根据自己 的需要,用同样的方法容易地定义出符合自己要求其他组合子来。

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

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

抽象 的手段

如果在 DSL 的构造中,仅仅提供了一些原子和组合手段,并且组 合的结果无法再次参与组合,那么这个 DSL 的扩展能力和适用性就会大大折扣 。相反,如果我们还能提供出抽象的手段对组合结果进行命名,命名后的复合实 体可以像原子一样参与组合,那么 DSL 的扩展能力就会非常的强大,适用性也 会大大增加。因此,抽象的手段在 DSL 的构造过程中是至关重要的。

敏 锐的读者可能已经发现,对于我们的解析 DSL 来说,其实在前面的小节中已经 使用了抽象的手段。比如,我们在 alpha,digit,digit_or_alpha 以及 alpha_before_digit 等复合解析器的定义中已经使用了抽象的手段来对其进行 命名,然后可以直接使用这个抽象的名字再次参与组合。由于我们的解析器是基 于 Java 语言中的 interface 机制定义的,因此,Java 语言中已有的针对 interface 的抽象支持机制完全适用于我们的解析 DSL。因此,我们就无需定义 自己的特定抽象手段,直接使用 Java 语言中的即可。

相信读者已经从 上一小节中的例子中看到组合、抽象手段的强大威力。在下一小节中,我们将给 出一个更为具体的例子:H.248 协议中 NAME 语法解析器的构造。

一个 H.248 实例

在本小节中,我们将基于前面定义的解析器原子和组合子, 实现用于识别 H.248 协议中 NAME 语法的解析器的构造。

H.248 是一个 通信协议,媒体网关控制器使用该协议来对媒体网关进行控制。H.248 协议是一 个基于 ABNF(扩展 BNF)文法描述的基于文本的协议,协议中定义了 H.248 消 息的组成部分和具体内容。我们仅仅关注其中的 NAME 语法定义,如下:

NAME = ALPHA *63(ALPHA / DIGIT / "_" ) ALPHA =  %x41-5A / %x61-7A  ; A-Z, a-z DIGIT = %x30-39        ; digits 0 through 9

我们首先来解释一下其中的一些 规则,*63 其实是 n*m 修饰规则的一个实例,表示最少 n 个最多 m 个,当 n 等于 0 时,可以简略写成 *m。因此,*63 表示最少 0 个,最多 63 个。/ 表 示或规则,表示两边的实体可选。()表示其中的实体必须得有一个。- 表示范 围。因此,DIGIT 表示单个数字,ALPHA 表示单个字母(大写或者小写), (ALPHA/ DIGIT/ “_” )表示要么是个字母,要么是个数字,要么是 个下划线。*63(ALPHA/ DIGIT/ “_” )表示,最少 0 个,最多

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