看Java有一阵子了,除了开发Android程序外,自己又开始动手写一些乱七八糟的东西,这次为自己带来了一个手机端C语言解释器。
话不多说上图:
JavaCC(Java Compiler Compiler..囧)为Java平台广泛应用于词法和语法分析的工具,类似于C语言的lex和yacc,可以翻译为纯Java代码,是用Java实现编译器和解释器的一个很好的工具.同时java还有另一个此法语法分析工具是Antlr.
JavaCC项目网站: https://javacc.dev.java.net/
JavaCC原Sample中的Interpreter项目主要目的为了解释JJTree的语法树生成器.其中包含了一个类C语言(被称为SPL: Stupid Programming Language)的语法文件,从而实现其解释器。其中实现了很多简单的语句,简单到只有int和bool类型,赋值语句和条件和while循环语句,read和write关键字用来输出。例子可以从JavaCC项目中得到.
我借其语法文件一用,加入了float类型和C语言的一样的注释方式。改写一部分代码并在JDK1.6上运行。后来加了写界面移植到J2ME,家变成现在的样子。其中遇到很多头痛的问题下面会进行说明。
项目地址: http://code.google.com/p/c2me/
下面开始简要说明开发过程:
一、JavaCC Eclipse插件:http://eclipse-javacc.sourceforge.net/
可以在eclipse上自动解析并翻译.jj或者.jjt语法文件为java本地解析代码。(其中jj文件为词法分析的文件,而jjt为语法树分析文件.两个内容几乎相同,但是jjt可以建立语法树,这样才能方便我们的解释器工作)
借用其官方图片来说明新JavaCC项目建立过程:
建立JJTree项目以后
图示即为jjt语法文件.
经过我修改过的jtt文件如下(可在项目源码中找到)
经过Eclipse和JavaCC插件编译后自动生成了jj和java文件.Eclipse会报告一些错误和警告,包括Package没有写,或者用到了Stack或者ArrayList容器但是没有声名所存储的模板类型,不用鸟他。运行就好了。
要说明生成的代码结构和各个文件所起到的作用不是很简单,请参考这些链接:
小型桌面计算器javacc的实现 http://mopishv0.blog.163.com/blog/static/54455932201081393726584/
还有一个链接是JavaEye的..悲剧的down掉了.. http://abruzzi.javaeye.com/
有了代码,我们run一下就可以得到一个命令行的解释器了。
输入像这样的类似C的代码就可以运行了
二、移植到J2ME平台
J2ME是J2SE的一个子集,去除了一些容器和很多平台相关内容,加入了J2ME专有的界面处理API和移动设备API。在不是很老的API中还是有float类型和经过包装的Float类的(让人欣慰..),同时让人欣慰的是java.util中包含了List和Stack容器类型.这样使我们移植过程中复杂度大大降低了.但是遇到一些实际的实现还是修改一些代码,比如这样的一个List容器移植到J2ME就要换种写法
要修改成
其中还有些问题,比如Stack等等容器最好是Object放进去,要修改响应数据,将其从源类型变为Object,在取出来的时候转换为所用类型,还有标准输出流OutputStream在J2ME里面没有了 只能替代成ByteArrayOutputStream并且转换到String再放到TextView中输出.其间历尽千辛万苦,终于修成正果。
最后加上了J2ME的界面,用到了TextView和buttons,加上事件,大功告成。
接下来就如项目中所说的TODO list一样了.准备加入for循环,更多的运算符,更多的常用数学函数,打造出更好的一个解释器拿来玩儿.