自己动手写C语言解释器手机版

 

看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循环,更多的运算符,更多的常用数学函数,打造出更好的一个解释器拿来玩儿.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值