試做 s 表達式解析器

用 lisp 資料結構實作 lisp 直譯器簡單在省去 從字串解析成巢狀鏈表的過程, 所以想試著寫一個從字串解析成鏈表的程式,看這步的難度。 是用比較熟悉的 javascript 寫的, 因為我不會 scheme 或 common lisp 的字串處理函數。

斷詞器

發現分成二部會比較好做,不然會太複雜。 先把字串拆成一個 tocken 鏈表, 也就是平展的表,裡面把 ( ) 也視作 tocken。

解析器

把平展的表解析的巢狀的表比較需要思考, 但其實 code 沒那麼長。 我是用遞迴做的,可能也只能用遞迴做? 但比較特別是沒有用到迴圈, 因為是用 sicp 教的思考方式, 而且要得到解析到哪裡還蠻麻煩的。

用 atom 代表一個字

本來還沒加字串時,是沒有用特殊物件的, 都直接用字串代表符號。 後來因為要和字串區分,只好引進一類似 tocken 的元素, 將字串、數字、符號都視為不同類的 tocken, 只是目前只實作了字串和符號。

目前的字串是用雙引號包起來, 中間要再放雙引號要用反斜線跳脫, 也可以放 enter 或任何其它字元。

其實字串和符號只有一線之隔, 可以把符號視為 只能比較相不相等 的字串, 但實作上可以用 hash 做,不用真得保存所有字元。 關於符號那些神奇的特性, 其實是依賴 eval 這個黑魔法實現的。

玩沙區

要先按 tockenize 把 s-expression 解析成 tocken list, 再按 nestize 把 tocken list 解析成巢狀。 目前用 atom 看起來有點醜, 因為被解析成 json 後會出現一堆 atom object。