用python實現一個簡易的lisp解釋器--表達式字元串的格式化(2)

本文我們實現表達式字元串的格式化。

要得到的格式

設想一下我們要輸入的表達式字元串是:

(* 2 (+ 3 4 (- 1 2)) 5)n

而我們的目標格式是一個 list

[* 2 [+ 3 [1 2]] 5] n

以下是解析代碼:

class ExpressionFormattor:n def format(self,exp):n if exp.isdigit() or (exp.find("") != -1 or exp.find(") != -1) or (exp.find("(") == -1 and exp.find(")") == -1):n return expn exp = exp.replace("n"," ")n return self._convert_to_list(exp)n def _convert_to_list(self,exp):n if exp.find("(") == -1:n return exp != "" and [exp] or []n exp_list = []n word = ""n i = 1n while i < len(exp)-1:n if exp[i].isspace():n if word != "":n exp_list.append(word)n word = ""n i += 1n elif exp[i] == "":n i += 1n elif exp[i] == "(":n right_par_index = self._find_right_parenthesis(exp,i)n exp_list.append(self._convert_to_list(exp[i:right_par_index+1]))n i = right_par_index + 1n else:n word += exp[i]n i += 1n if word != "":n exp_list.append(word)n return exp_listn def _find_right_parenthesis(self,exp,left_index):n count = 0n for i in range(left_index,len(exp) - 1):n if exp[i] == "(":n count += 1n elif exp[i] == ")":n count -= 1n if count == 0:n return in return -1n

推薦閱讀:

scheme中letrec的語義要如何轉化以及實現?
SICP 1.45證明?
相比 Scheme 與 Common Lisp,Clojure 有哪些坑?
淺嘗The Little Prover一書, 重逢Chez Scheme
(如何(用Python)寫一個(Lisp)解釋器(下))

TAG:解释器 | Scheme | SICP |