試做 s 表達式解析器
用 lisp 資料結構實作 lisp 直譯器簡單在省去 從字串解析成巢狀鏈表的過程, 所以想試著寫一個從字串解析成鏈表的程式,看這步的難度。 是用比較熟悉的 javascript 寫的, 因為我不會 scheme 或 common lisp 的字串處理函數。
斷詞器
發現分成二部會比較好做,不然會太複雜。
先把字串拆成一個 tocken 鏈表,
也就是平展的表,裡面把 (
)
也視作 tocken。
解析器
把平展的表解析的巢狀的表比較需要思考, 但其實 code 沒那麼長。 我是用遞迴做的,可能也只能用遞迴做? 但比較特別是沒有用到迴圈, 因為是用 sicp 教的思考方式, 而且要得到解析到哪裡還蠻麻煩的。
用 atom 代表一個字
本來還沒加字串時,是沒有用特殊物件的, 都直接用字串代表符號。 後來因為要和字串區分,只好引進一類似 tocken 的元素, 將字串、數字、符號都視為不同類的 tocken, 只是目前只實作了字串和符號。
目前的字串是用雙引號包起來, 中間要再放雙引號要用反斜線跳脫, 也可以放 enter 或任何其它字元。
其實字串和符號只有一線之隔, 可以把符號視為 只能比較相不相等 的字串, 但實作上可以用 hash 做,不用真得保存所有字元。 關於符號那些神奇的特性, 其實是依賴 eval 這個黑魔法實現的。