一个 tiny Lisp 语言解释器的实现

  最近上了编译原理课,买了本龙书看了看,想到寒假看的lisp语言,感觉实现个lisp前端实在是简单,毕竟lisp 的语法是 S-expression ,非常接近抽象语法树,平时上课比较忙,今天有时间就用python简单写了一个,能实现基本语法,定义变量,lambda 表达式,和用lambda表达式实现的定义函数。写的很仓促,以后有时间再改进。

 

 实现其实很简单,首先是将命令解析,一条命令存为一个list,例

 

 然后分别处理。

其中比较难的两点是 局部变量和lambda表达式的实现。

函数暂时用lambda 表达式实现了,没有过多的封装,其实最终也准备用lambda表达式。

局部变量定义了类Env

 1 class Env(dict):
 2     "An environment: a dict of {'var':val} pairs, with an outer Env."
 3     def __init__(self, parms=(), args=(), outer=None):
 4         self.update(zip(parms, args))
 5         self.outer = outer
 6 
 7     def find(self, var):
 8         "Find the innermost Env where var appears."
 9         if var in self:
10             return self[var]
11         elif self.outer is None:
12             return var
13         else:
14             return self.outer.find(var)

调用lambda表达式时创建一个新的env,也就相当于局部环境

lambda表达式用Procedure类实现

1 class Procedure(object):
2     "A user-defined Scheme procedure."
3     def __init__(self, parms, body, env):
4         self.parms, self.body, self.env = parms, body, env
5     def __call__(self, *args):
6         return eval(self.body, Env(self.parms, args, self.env))

保存形参,函数体的列表,调用时解析。

 整体来说思路很清晰,但这次过于匆忙,代码有些乱,下次有时间重构下。

 

 代码稍后上传:Github

 

posted @ 2017-03-09 22:43  爱吃土豆的男孩  阅读(796)  评论(1编辑  收藏  举报