程式語言學習心得 6
補上了之前沒實作的 syntax :: [Token] -> CoreProgram :
syntax :: [Token] -> CoreProgram
syntax = take_first_program . pProgram
where
take_first_program ((prog, []) : others) = prog
take_first_program (parse : others) = take_first_program others
take_first_program others = error $ "Syntax error: " ++ (show others)翻成白話是:
- 如果現在看到的是一個 parse 完成的 program ,那就是它了!
- 如果現在看的沒 parse 完,那就看下一個,
- 如果看到最後都沒找到 parse 完的,就報錯。
pProgram 只要用已經建立好的 parsers ,就能按書上第 18 頁的 BNF syntax 做出來。但要注意,該濾掉的關鍵字得濾乾淨,不然連簡單的 f = x 都 parse 不出來。
昨天自己亂做,馬上撞到 left recursion ,也就是:
pExpr = pThan EAp pExpr pAexpr造成 pExpr 自己呼叫自己,停不下來的慘劇。
建議的解法是改成:
(pOneOrMore pAexpr) `pApply` mk_ap_chain雖然 pOneOrMore 保證回來的陣列至少會有一個元素,但得在 mk_ap_chain 裡寫下 error "Syntax error" 還是覺得不舒服 XD
mk_ap_chain :: [CoreExpr] -> CoreExpr
mk_ap_chain [] = error "Syntax error: EAp"
mk_ap_chain (x:[]) = x
mk_ap_chain (x:y:xs) = mk_ap_chain (EAp x y : xs)明天要處理 infix operators 。然後第二章講的是 template interpreter ,第三章才是我一直想了解的 G-machine 。
長路漫漫~