用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)解釋器(下))