利用Java实现组合式解析器

简介:Ward Cunningham 曾经说过,干净的代码清晰地表达了代码编写者所 想要表达的东西,而优美的代码则更进一步,优美的代码看起来就像是专门为了 要解决的问题而存在的。在本文中,我们将展示一个组合式解析器的设计、实现 过程,最终的代码是优美的,极具扩展性,就像是为了解析特定的语法而存在的 。我们还会选取 H.248 协议中的一个例子,用上述的组合式解析器实现其语法 解析器。读者在这个过程中不仅能体会到代码的美感,还可以学习到函数式编程 以及构建 DSL 的一些知识。

DSL 设计基础

我们在用编程语言(比如:Java 语言)实现某项功能 时,其实就是在指挥计算机去完成这项功能。但是,语言能够带给我们的并不仅 仅局限于此。更重要的是,语言提供了一种用于组织我们的思维,表达计算过程 的框架。这个框架的核心就在于,如何能够把简单的概念组合成更为复杂的概念 ,同时又保持其对于组合方法的封闭,也就是说,组合起来的复杂概念对于组合 手段来说和简单的概念别无二致。引用“Structure and Interpretation of Computer Programs”一书中的话来讲,任何一个强大的语言都是通过 如下三种机制来达成这个目标的:

原子:语言中最简单、最基本的实体;

组合手段:把原子组合起来构 成更复杂实体的方法;

抽象手段:命名复杂实体的方法,命名后的复杂 实体可以和原子一样通过组合手段组合成为更复杂的实体。

像 Java 这 种通用的编程语言,由于其所关注的是解决问题的一般方法。因此,其所提供的 这三种机制也都是通用层面的。在解决特定问题时,这种通用的手段和特定问题 领域中的概念、规则之间是存在着语义鸿沟的,所以某些问题领域中非常清晰、 明确的概念和规则,在实现时就可能会变得不那么清晰。作为程序员来说,用干 净的代码实现出功能仅仅是初级的要求,更重要的是要提升通用语言的层次,构 建出针对特定问题领域的语言(DSL),这个过程中很关键的一点就是寻找并定 义出面向问题领域的 原子概念、组合的方法以及抽象的手段。这个 DSL 不一定 非得像通用语言那样是完备的,其目标在于清晰、直观地表达出问题领域中的概 念和规则,其结果就是把通用的编程语言变成解决特定问题的专用语言。

我们曾经在“基于 Java 的界面布局 DSL 的设计与实现”一 文中,构建了一种用于界面布局的 DSL,其中呈现了上述思想。在本文中,我们 将以解析器的构造为例,来讲述如何构建一种用于字符串解析的 DSL,这种 DSL 具有强大的扩展能力,读者可以根据自己的需要定义出自己的组合手段。此外, 从本文中读者还可以领略到 函数编程的优雅之处。

时间: 2024-12-26 21:42:17

利用Java实现组合式解析器的相关文章

jsoup v1.6.0发布 一款Java的HTML解析器

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据.其他方面的改进请看发行说明. jsoup 1.6.0发行说明: jsoup is a Java library for working with real-world HTML. It provides a very convenient API for extracting and manipulati

jsoup v1.5.2发布 一款Java的HTML解析器

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.比起之前用的HTMLhttp://www.aliyun.com/zixun/aggregation/33959.html">Parser方便很多,而且更轻便.语法类似jquery. 它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据. This is a minor release, that primarily corrects a regress

javaweb-java-jsoup异常处理,JAVA的HTML解析器.

问题描述 java-jsoup异常处理,JAVA的HTML解析器. java.lang.IllegalMonitorStateException 怎样解决,FileOutputStream out = new FileOutputStream(file); 100: int i = 0; while((i=is.read()) != -1){ out.wait(i); } 127:for(Element element : elements){ String imgSrc = element.a

jsoup v1.5.1发布 一款Java的HTML解析器

Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从HTML中攫取你所需的信息 和扩展 HTMLhttp://www.aliyun.com/zixun/aggregation/33959.html">Parser 对自定义标签的处理能力.但现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了 jsoup . jsoup

jsoup 1.6.3发布 一款Java的HTML解析器

jsoup 是一个HTML的Java库.它可以从一个URL.文件或字符串中解析HTML,使用DOM遍历或CSS选择来发现并提取数据操作,包含HTML元素.属性和文字. jsoup 1.6.3该版本进行了一些改进和bug修正,包括继续支持谷歌App Engine和解析修正. 软件信息:http://jsoup.org/ 下载地址: jsoup-1.6.3.jar core library jsoup-1.6.3-sources.jar optional sources jar jsoup-1.6.

对Java中JSON解析器的一些见解_java

最近在研究JSON,Java中有很多处理JSON的类库,lib-json.sf-json.fastjson还有Jackson Json.第一个就不说了,性能和功能都没有什么亮点. sf-json最大的优点就是随机读取方便.代码很简单: JSONObject json= JSONObject.fromObject(str); 然后读取字段内容: json.getString或者getInt之类的.但是工作效率有待商榷,而且容易出错. 另外sf-json还有个优点就是自动使用unicode编码,当内

JAVA中RSS解析器(rome.jar和jdom.jar)范例

1.需要 jdom.jar 和 rome.jar 这两个包. 2.创建一个项目,web.xml的内容如下:  代码如下 复制代码 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5"          xmlns="http://java.sun.com/xml/ns/javaee"          xmlns:xsi="htt

实现高性能Java解析器

备注: 本篇文章是关于先前相同主题文章的最新版本.先前文章主要介绍创建高性能解析器的一些要点,但它吸收了读者的一部分批评建议.原来的文章进行了全面修订,并补充了相对完整的代码.我们希望你喜欢本次更新. 如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析器存在缺陷,或者开源解析器项目被取消诸如此类原因.上述原因都没有你将需要实现你自己的解析器的事实重

实现Java中的高性能解析器

在某些情况下,你可能需要在Java中实现你自己的数据或语言解析器,也许是这种数据格式或语言缺乏标准的Java或开源解析器可以使用.或者虽然有现成的解析器实现,但它们要么太慢,要么太占内存,要么就是没有符合你所需要的特性.又或者是某个开源的解析器存在缺陷,要么是某个开源解析器的项目中止了,原因不一而足.不过无论原因是什么,总之事实就是你必须要自己去实现这个解析器. 当你必须自己实现一个解析器时,你对它的期望会有很多,包括性能良好.灵活.特性丰富.方便使用,以及便于维护等等.说到底,这也是你自己的代