python写cdr插件_python 写一个scheme解释器(一)

一、解释器的本质

1. 我们换一种语言来写解释器的时候,其实本质和scheme写scheme是一样的,即将输入的一串字符串作为源程序执行而语法和语义均由自己预先设计好并严格执行。

2.

这里我们采用python 来实现我们的第二版的scheme解释器,首先python支持的列表推导式、lambda、模式匹配等语法糖十分适合去编写解释器,另一方面,python内置数据结构齐全,使用简单。

当然我们采用C++ 也是完全可行的,但由于C++对字符串的处理功能比较弱,并且不同类型数据的转换都需要手工去完成,实现的时候噪音太多,即关注在一些并非本质问题上的时间比较多。但其实完全从头用C++ 写一个的话更能提高对这一问题的认识。

在难实现和收获大这样的问题上的选择自然是见仁见智的了。

java 或者c#当然更是可行的了,但如果采用C语言来做的话,感觉稍显麻烦,得不偿失。

3. 解释器实现的流程:

如果看过任何一本编译原理的书籍,绪论中就会介绍这个过程

a) 词法分析

将字符串流转换为一个个有意义的token单元:

比如(cons 1 2)应该分解为 ‘(’ ‘cons’ ‘1’ ‘2’ ‘)’ ,这里将左右括号也作为token列出,因为它是scheme中一个简单表达式的定界符。

b) 语法分析

将tokens转换为语法分析树,一般编译原理的教材这里都会以表达式求值为例,比如 1+2 *3-2,很容易写出它的语法树

对于前序的表达式:(/ (+ 1 (* 3 2 ) (- 2 3) ),也十分简单。

之前的博文《递归下降解决表达式求值》一文中详细的讨论过类似的问题,这里我们利用表达式自身的递归性质,即我们只要把最小的表达式单元都找到并且括起来然后求值就可以了,嵌套的复杂表达式的每一部分都会递归的调用解释器去求值。

举个简单的例子, (cons 1 (cons 2 3) )

词法分析之后: ‘(’ ‘cons’ ‘1’ ‘(‘ ‘cons’ ‘2’ ‘3’ ‘)’ ‘)’

语法分析之后: [‘cons’ 1 [‘cons’ 2 3] ]

观察发现主要就做了两件事情:

1. 数字等自求值的单元转换为其值;

2. 将子表达式组成一个列表;

c) 求值

在将输入的字符串转换为语法分析后的结果后,我们应该做的就是根据语义去求值了,这里用python实现,所以直接将其翻译为python中的某些数据结构和函数上,到这一步之后解释器就结束了,不涉及中间代码或者汇编的翻译。

上两篇博文谈到了,求值器需要的参数是:程序 + 求值环境,而环境本质上就是一个变量和值的键对,所以用python中的dict 实现就可以了。

4. 上面实现完成之后其实解释器已经完成了,剩下的是一些交互界面的问题。

二、语法的定义和筛选

上面的流程大致就是那样了,和用scheme来实现如出一辙,同样我们需要考虑的是我们的解释器提供哪些功能和能力,这里最好的方式是在提供足够的抽象屏障的基础上,由简单到复杂逐步去扩充,而不是先定义完备的语法,然后按照上面的流程去一一实现。

比如我们先实现一个算术求值器,它包含了上面流程中的所有步骤,然后再添加比如cons、car、cdr、list等一些内置的数据结构和常用的函数,之后再添加变量的支持、lambda函数的支持、过程调用的支持。

需要注意的是函数和环境的实现,在之前用scheme实现的时候已经提到了,比如函数的闭包性质需要保持、环境的接口性质必须遵守等等。

这一部分才是真正关键而有意义的部分,更具体的内容和实现见下次博文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主要功能:理论上,该程序可以解码任何基于BER编码的CDR文件。不过,由于我在工作中只接触到Ericsson的某些版本的CDR,而且,用于解析CDR文件的描述文件来源于供应商,我的程序也只能识别来自于这个供应商的描述文件,所以,移植到其它厂商的环境下可能会产生一些问题。希望大家试用过后能够把各种情况反馈给我,最好能够把BER编码的CDR样本及其描述文件发给我,这样我就能够作为依据,完善这个程序了。 主要特点: 1. 高速!该程序比目前我在网上见到过的所有能够使用的同类型程序都要快,甚至在同等条件下,比我所在公司的供应商提供的程序还要快15%到20% 2. 支持关键字搜索。不需要把整个CDR文件的记录全部翻译成文本记录再逐个查找,而是在解码的过程中顺便完成搜索,节省时间和空间 3. 直接支持压缩格式。通常CDR文件都是经过压缩后保存在磁盘的,该程序可以直接读取经过压缩后的CDR文件,不需要把它首先解压缩,然后再解码,进一步提供效率。同时,这个程序也支持压缩输出文件,为用户提供方便。目前支持的压缩格式有gzip和bzip2 最新版本: 1. destroy 1.0.0 for Linux 2. destroy 1.0.0 for Solaris 3. destroy 1.0.0 for Tru64 依赖关系:由于该程序支持压缩格式,因此它依赖于libz和libbz2 使用方法:键入./destroy –h可以获得所有帮助信息 $./destroy -h ./destroy 1.0.0 (2010-06-28) This is a program decoding a BER encoded CDR file Author: Roy Liang Blog: http://blog.csdn.net/yui/ Usage: ./destroy -f <file_name> -o <output_name> [-c <config_name>] [-k <keyword>] [-z] [-j] -f --file the CDR file to be decoded -o --output the output file in plain text format -c --config the description file of the CDR file, if not given, use default configuration -k --keyword the keyword to search, if not given, all records will be written into output file -z --gzip gzip the result -j --bzip2 bzip2 the result -h --help print this page

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值