一个 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