博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JavaCC学习心得(转)

Posted on 2012-10-18 20:34  蜗牛57  阅读(739)  评论(0编辑  收藏  举报

这个是之前实习的时候写的最后一篇文档,不知道现在有没有广为流传(YY),不知道什么时候才能再有当时的心境。

1. 关于JavaCC

JavaCC可以解决的问题,完全可以使用传统的字符串处理的方式来解决(这需要一点编程能力+坚强的毅力+十二分的耐力,我都没有,所以发现了JavaCC),JavaCC只是提供了一种更优雅的处理方法。

这种处理问题的思想其实是编译原理中的文法分析和语法分析,JavaCC只是它们的一种java实现而已。这种思想也许一辈子都不会用到,但是一旦用到了,就非它不可!

我对JavaCC的了解也比较肤浅,写这个心得主要是提供一些参考资料,可以让初学者少走一些我走过的弯路。一家之言,仅供参考。

2. JavaCC的官方网站

https://javacc.dev.java.net/

官方网站上不仅提供了javacc的最新版,而且提供了一些语法示例,例如用javacc定义C,C++的语法等,在了解了javacc的基本语法之后,再看大师们是如何使用javacc的,会有醍醐灌顶的感觉。

学习JavaCC最好有形式文法的基础知识,程序设计语言的语法基本上都是形式文法中的上下文无关文法,不懂形式文法也可以学习JavaCC,但是如果想对JavaCC有更深入的理解,进入更高的一个层次,形式文法,句法分析,语法分析是必须要了解的。

学习JavaCC的语法可以分以下几步:

1、 The JavaCC Tutorial

这是Theodore S. Norvell(主页地址:http://www.engr.mun.ca/~theo)的Informal Publications中的一篇,在Norvell的博客上提供了第一章的手稿,PDF版可从这里下载:

http://www.engr.mun.ca/~theo/JavaCC-Tutorial/

这里提供了一个翻译版,翻译质量还不错:

http://code.google.com/p/orzjisp/wiki/The_JavaCC_Tutorial

2、 官方文档

在下载的JavaCC里。

我没有看这个文档,据说写的不错,还是应该读一下的。

3、 实践

学会了语法之后,自己动手写几个小例子,可以发现理解语法上的盲点。下载的JavaCC里带了一些例子程序,这个对学习很有帮助,看程序之前先读一下里面的README。读一些官方网站上提供的例子,会对语法有更深刻的理解。

4、 他山之石

对JavaCC基本掌握之后,看一下别人的博客,每个人都会看到别人看不到的东西,看看别人都看到了什么,不妨自己也写一篇。

推荐几个篇博客:

使用JavaCC扩展SQL语句的一个例子:

http://www.360doc.com/content/07/0925/17/13829_770014.shtml

用JavaCC实现了一个叫做CMM的简单语言:

http://ajava.org/course/open/17373.html

5、 修炼

以上4点用两天时间绰绰有余,但是此时JavaCC也只是一个工具,点头之交而已,需要更长的时间磨合,培养感情,彼此了解,从JavaCC的角度去看待问题,也让JavaCC去理解你的问题,使用JavaCC是一种合作,一种享受。JavaCC此时已经变成了朋友。

(修行不够,意淫而已,还没到这个境界)

3. Eclipse Plug-in

有了这个写JavaCC就爽多了,介绍很详细,不多说。

http://eclipse-javacc.sourceforge.net/

4. JJDoc

这个工具的作用是提取jj文件中的BNF范式,更清晰的表示范式定义,很实用。

用法很简单,只有一个参数,即jj文件:

jjdoc <jj文件>

这样就会在当前目录下生成一个HTML文件,如果jj文件是unicode编码,生成的HTML文件中的中文会出现乱码。

jjdoc更多的参数参见JavaCC中jjdoc的文档。

5. JJTree

在把JavaCC应用到具体的项目之前,建议先了解一下JJTree。经过前面的学习,相信你已经了解了JavaCC的强大,已经跃跃欲试,甚至会因为JavaCC已经帮忙做了大量的解析工作,自己毫无怨言地进行后续的进一步解析,请保持冷静,也许你又在重复造轮子了。(以上是我的教训)

JJTree是什么,做什么用的,可以这么回答,JJTree是生成解析树的,jjTree的作用是将终结符通过规则规约成非终结符节点,但是这种官方式的回答没有多少实际的意义,我对JJTree的了解很有限,还不能给出一种民间的说法(但是,我真正理解了JJTree之后,再回答这两个问题,很可能会觉得没有比官方回答更精确的,这就是学习吧)。

我本想拿TQL项目中的where条件解析来说明一下,但是这需要介绍TQL的太多东西,与JJTree关系不大。其实我们也并没有采用JJTree,一个重要的原因就是JJTree的学习成本太高,学习成本高的一个原因是资料贫乏。

我目前没有找到一个如The JavaCC Tutorial那样的文档,读完之后就可以做一些简单的例子。官方文档读了几遍没看明白,网上搜资料,漫天遍野的都是官方文档的一个生硬翻译的转载,很多博客也只是对这个翻译的截取。幸好看到一篇博客中介绍了一篇Introduction to JJTree,看过之后才算看到了一点希望。言归正传。

1、 Introduction to JJTree

http://www.j-paine.org/jjtree.html

不知道开始就读这个introduction会有什么感觉,我被官方文档百般折磨之后,读到这篇觉得很清新。

2、 官方文档

在下载的JavaCC里。

我开始读不懂这个文档,是里面太多术语,容易混淆,对于我这样的初学者难度太大。但这不能说明这个文档的价值低。

翻译版:

http://blog.csdn.net/CharlesYY/archive/2006/08/08/1035413.aspx

翻译总是费力不讨好的事,还是很感谢译者的。

至于是先读官方文档,还是先看博客、例子,这个因人而异吧,我是读文档读不下去了,看看博客,例子,然后再回来看文档,JJTree的学习不是线性的,而是一个迭代的过程。

3、 例子程序

在下载的JavaCC里。

这里的例子价值更大,我是对照例子看文档和博客。

4、 他山之石

这篇博客提到了introduction:

http://www.zhaoxiangpeng.com/2006/11/jjtree%E5%92%8Cjavacc%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

感觉这篇写的很用心:

http://www.javaeye.com/topic/363058

这篇可以结合文档一起看:

http://zhoujinhuang.javaeye.com/blog/169257

刚刚看到,还没来得及看:

http://www.softwaresecretweapons.com/jspwiki/jjtree-tutorial-for-advanced-java-parsing

6. JavaCC FAQ

这个也是在Theodore S. Norvell的主页上找到的,搜罗了很多问题,如果遇到问题可以在上面找一下,没事也可以翻一翻,提高功力。

http://www.engr.mun.ca/~theo/JavaCC-FAQ/

7. JTB

这个是在插件中看到的,不是官方的,与JJTree功能类似,全名为Java Tree Builder,没有深入研究,以下为官方主页:

http://compilers.cs.ucla.edu/jtb/