用python實現一個簡易的lisp解釋器--解釋器基本結構的實現(5)
本文我們將實現一個解釋器的基本結構。
思路
一個解釋器的執行主要靠兩個函數:eval
和 apply
。
eval
會把你輸入的表達式分解成更小的表達式並逐個執行,而 apply
會執行你的表達式。基本流程是這樣的,例如你輸入一個表達式 (+ 1 2 (/ 3 3))
,首先 eval
會把 (+ 1 2 (/ 3 3))
視為一整個表達式,然後會遞歸執行 eval
解析 (/ 3 3)
,最後 (/ 2 3)
這個表達式已經不可再分解了,就會調用 apply
執行 /
的操作,最後返回結果給上一個表達式,得 (+ 1 2 1)
,再執行 apply
得出最終結果 4
。
其中 primitive
為默認的操作符,例如 +
,-
,*
,/
,我們之後再實現。
實現
class Evaluator: def __init__(self,primitives): self._exp_parser = ExpressionParser() self._primitives = primitives def eval(self,exp,env): if exp == []: return if isinstance(exp,Expression) == False: exp = self._exp_parser.parse(exp,env) return exp.eval(self,env) def apply(self,proc,args): if isinstance(proc,ProcedureExpression): proc.env = Environment.extend_environment(dict(zip(proc.args, args)),proc.env) return proc.eval(self,proc.env) return proc(*args)def init_primitives(): global_env.get_frame().set_variables(primitives)def run_evaluator(): print("--------------------
") print("Input Expression:
") exp = raw_input() exp = exp_formattor.format(exp) print(evaluator.eval(exp,global_env)) print("
End Evaluation") print("--------------------
") run_evaluator()if __name__ == __main__: global_env = Environment() exp_formattor = ExpressionFormattor() primitives = { "+": add, "-": subtract, "*": multiply, "/": divide, "=": equal, "list": to_list, "cons": cons, "car": car, "cdr": cdr, "null?": null} init_primitives() evaluator = Evaluator(primitives) run_evaluator()
推薦閱讀:
※sicp 習題1.5 正則序和應用序求值疑問?
※EOPL是一本怎樣的書?和SICP如何比較?
※SICP中環境模型可以等價為龍書中(第七章)講的的運行時刻環境么?
※SICP 是不是被高估了?
※用python實現一個簡易的lisp解釋器--表達式字元串的格式化(2)