前兩個(gè)周末寫(xiě)了《手寫(xiě)PHP轉(zhuǎn)Python編譯器》的詞法,語(yǔ)法分析部分,上個(gè)周末卡文了。

訪問(wèn)器部分寫(xiě)了兩次都不滿(mǎn)意,沒(méi)辦法,只好停下來(lái),參考一下Python的實(shí)現(xiàn)。我實(shí)現(xiàn)的部分正好和Python是一個(gè)思路,就是生成CST(Concrete syntax tree)之后,再生成AST。由于我想創(chuàng)(tou)新(lan),所以未沒(méi)有詳細(xì)實(shí)現(xiàn)AST,而想繞過(guò)AST去生成代碼。這下有點(diǎn)欲速不達(dá)了。

先看看Python執(zhí)行代碼的過(guò)程:

1.     Tokenizer進(jìn)行詞法分析,把源程序分解為T(mén)oken

2.     Parser根據(jù)Token創(chuàng)建CST

3.     將CST轉(zhuǎn)換為AST

4.     將AST編譯為字節(jié)碼

5.     執(zhí)行字節(jié)碼

現(xiàn)在我們要實(shí)現(xiàn)第3步。參考一下Python源碼:

/* Transform the CST rooted at node * to the appropriate AST*/mod_ty
PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filenam