博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个 tiny Lisp 语言解释器的实现
阅读量:4456 次
发布时间:2019-06-08

本文共 1208 字,大约阅读时间需要 4 分钟。

  最近上了编译原理课,买了本龙书看了看,想到寒假看的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 var13         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, env5     def __call__(self, *args):6         return eval(self.body, Env(self.parms, args, self.env))

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

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

 

 代码稍后上传:

 

转载于:https://www.cnblogs.com/dk666/p/6528326.html

你可能感兴趣的文章
未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
查看>>
Android电源管理
查看>>
C#_基础_方法以及方法重载(十)
查看>>
新起点新希望
查看>>
php 做数学运算时结果为0的原因
查看>>
LINQ系列:LINQ to DataSet的DataTable操作
查看>>
ASP。net 测验
查看>>
java开发环境搭建-慕课网
查看>>
NOIP2015-D2T3运输计划
查看>>
Z :彻底了解指针数组,数组指针以及函数指针 [复
查看>>
用的好好的,Cygwin变的不好用了。
查看>>
2013年终总结
查看>>
在IIS中部署.net core应用
查看>>
hihocoder编程练习赛52-3 部门聚会
查看>>
CF1059C Sequence Transformation
查看>>
Start to study Introduction to Algorithms
查看>>
AE常见接口之间的关系(较笼统)+arcgis常见概念
查看>>
正则表达式
查看>>
三元操作设计不同类型的时候,最终结果的问题
查看>>
POJ 1661 Help Jimmy LIS DP
查看>>