一个脚本解释器的实现与分析(HOC改进版)
HOC(High Order Calculator)是一个解释型的程序语言,最初的版本由Brain Kernighan和Rob Pike在《The UNIX Programming Environment》一书中作为一个例子给出。本身由lex/yacc构造,结构十分清晰,作为一个教学语言,HOC支持函数,具有类C的语法,有简单的I/O,变量赋值,表达式计算,错误恢复等机制。后来,Bell实验室又陆续开发出了一些改进的版本,使得HOC可以平坦的移植到各种Linux系统中,我在上学的时候阅读过这本书,并且对其中的HOC做了一些简单的改进,后来又找到了Bell实验室的一个版本,深入的学了一遍,由于这个发布版本出自Research UNIX系统,我又对源码做了一些修改,并将其移植到了Windows平台。
在第一次学习HOC解释器的时候,是在编译原理课程结束后,当时是想在linux下设计一个通用的数学计算引擎,然后将计算出的数据通过一个前端展示系统(最好平台无关)展示给最终用户。开始,准备用Delphi自己写一个,但是一直没有实现,这个项目就停止了。直到后来发现了一个优秀的绘图工具gnuplot(关于gnuplot的更多细节,请参看我的另一篇文章), 用它来做前端似乎再合适不过了,于是,我决定将原来的改进后的HOC移植到Windows下,然后进行一个简单的整合。
下面是用HOC语言写的一段代码:
http://www.agoit.com/upload/attachment/52331/00d16e39-657b-35cb-9467-c664ee0d8d8c.png
代码很简单,先定义一个过程:plotSin(在HOC中有procedure,function之分,前者没有返回值,而后者有),这个过程定义了三个临时变量begin,end,step,其中PI是一个常量,其值为3.1415926, 然后是一个for循环,begin不断加step(0.1),直到不小于end,退出循环,同时每次迭代时,先计算sin(begin)的值,并打印此时的begin和sin(begin)值。最后,调用这个过程,执行计算并退出。
这个是程序生成的数据:
http://www.agoit.com/upload/attachment/52333/db0ac88e-38e5-3aa3-9de0-5cb8ebb360cd.png
将数据交给gnuplot展示,gunplot可以轻易的从数据文件中读出数据,并以第一列为横坐标,第二类为纵坐标画出图形来,根据上边这个数据文件,gnuplot画出的图形结果如下:
http://www.agoit.com/upload/attachment/52335/1438d5c2-73a0-3d71-abff-8b8789efff22.png
如果需要绘制3-D的图形,事实上更为简单一些。如下面的代码所示:
http://www.agoit.com/upload/attachment/52337/874b1dcd-6fa3-3853-b1c8-9ccdabb5b333.png
代码很简单,就是两层循环,计算出sin(x)*cos(y)的值,打印出来,一次x迭代结束后,打印一个空行,这样gunplot可以识别次文件,并画出3-D的图形来。
使用gnuplot的3-D绘制命令,splot,可以得到下边的图形:
http://www.agoit.com/upload/attachment/52368/88f241a6-57cc-3f4c-bf0d-4e368b4167d8.png
z = sin(x)*cos(y)
http://www.agoit.com/upload/attachment/52370/f669634a-352b-3339-a44c-ec199863c4a4.png
z = x * y
http://www.agoit.com/upload/attachment/52374/11330381-d533-3459-86d6-1daa500151c8.png
z = x^2 - y^2 (鞍面)
整个思路很清晰,没有什么难懂的地方,而这个HOC的原始版本就是在UNIX下用lex/yacc开发的,只要对正则表达式和BNF形式比较熟悉就可以很快的理解整个解释器的实现(建议直接去看源码)。如果不太熟悉,那么就接着往下看,我会详细解释这些工具的用法和一些形式语言的理论。
[*]形式语言
在计算机科学中,形式语言是用精确的数学定义或者机器可识别的公式定义的语言,形式语言跟自然语言很类似,包含两部分:语法和语义。形式语言的定义为:
<div class="quote_title"> 写道
页:
[1]