編寫的 VB 編譯器已實現詞法和語法分析,下一步應該如何實現抽象語法樹和語義分析?

RT:

準備寫一個VB的編譯器

已實現詞法和語法分析, 下一步抽象語法樹和語義分析該如何走? 求指導~~ 有沒有具體一點的例子, 這方面的技術博客太少了.


看clang 2.6中clang的代碼,這是clang的第一版,很簡單,c++寫的。只支持c和oc。

還有一個是@wgtsam 的回答http://www.zhihu.com/question/35226878/answer/122792721,他實現了一個你說的編譯器,源碼在github有。

還有lcc,工業級的c寫的編譯器,只支持c。 但是代碼比較不好懂,風格組織不好。 還是建議看clang2.6,源碼github也有。

當然也可以看一下我的回答和提問。


語法分析的結果就是語法樹啊,你說你搞定了語法分析沒做語法樹是怎麼回事?

GitHub - vczh-libraries/Workflow: Debuggable script language for interoperation with C++ using reflection. 我也實現了一個簡單的腳本引擎,用來配合GacUI做代碼生成的,結構優美,沒有優化,簡單易懂,順手做了調試功能,還有大量的單元測試,題主可以閱讀一下。


http://blog.csdn.net/xtlisk


剛剛嚕了一個mini-go語言(go語言的子集)的編譯器的人過來強答一下~

題主說已經完成了詞法和語法分析,但又說道下一步抽象語法樹和語義分析該如何走?按理說題主完成第一步後就應該已經生成ast(抽象語法樹)了。。。。所以我在這裡就假設題主已經完成了這一步吧。。。。。

-------------------------------------------------------------------------------------------------------------------------------

生成ast樹後下一步的工作是type check。因為生成ast後只能保證源代碼的語法是正確的,但不能保證語義是正確的,舉個栗子

int a=3;

char b="f";

b=b+a;

這3行代碼在語法上是正確的,但語義上是錯誤的。(類型不匹配),語義錯誤不止這一種,具體翻書

所以要做type check,相信題主已經看過書了,這裡就不展開講了,舉個最簡單的例子

(我們用G來表示當前的environment。你可以把G看作一個pair(var_name,type)的列表或者字典)

source code:

{

int x;

char y;

int z=x+y;

}

type checking:

int x;

---------------

G|-{x:int}

int y;

---------------

G |-{x:int, y:char}

int z=x+y

---------------

type unmatch!

在這裡type check要做的是先檢查右邊的表達式x+y,如果表達式合法則返回表達式類型,然後和左邊變數的類型比較,如果匹配則成功,並視具體情況更新當前環境。如果不成功就報錯

在type check中你要解決如下大致幾個問題

1、變數的作用域

2、變數的定義/重新定義

3、函數的類型綁定

type check完了後你的程序就是正確的了,然後就可以根據ast來生成intermediate code和machine code了。在這部分比較麻煩的是

1、函數調用/遞歸調用

2、跳轉

3、寄存器分配

4、並發(這個看語言)

以上就是要寫一個編譯器的大致流程,大多數的編譯器優化都是針對生成的intermediate code來的,所以如果你要讓編譯器變得更聰明一些可以在intermediate code上下下功夫。當然如果你要偷懶的話也可以直接生成LLVM,然後讓它幫你完成優化和生成machine code

希望可以幫到你,如有錯誤請指正


首先善意的批評一下題主,寫個編譯器也算是個比較大的工程,應該事先規劃規劃,怎麼能寫到一半不知道怎麼辦了呢!

正巧我這個學期正在學編譯原理,雖然要到下學期才做課程設計,但是出於興趣,我自己開始研究了一些,希望能給題主以及希望自己動手寫編譯器的人一些幫助,能少走彎路,我的目的就達到了。

首先,以我們學校的課設為例,如果你的最終目的不是機器碼,應該能根據語法樹生成中間代碼了,也就是語法制導翻譯(正好今天講的,沒完全消化,不敢多說),一般來說,如果你是做課設,語義分析應該就是生成中間代碼,然後解釋執行了。不複雜。

下面,推薦幾本參考書,都是實踐性比較強的,各有優劣,但是網上沒誰提過,更別說比較了,在這裡,說說的的感受,如有錯誤,還請指正。

相信看過這幾本書,對於實現編譯器應該心中有數了。

-------------------下方乾貨,準備收藏--------------------------------------------

1.《自製編譯器》

秉承日本人技術書籍的文風,通俗易懂,但不是完全手工構造,藉助了javaCC,全java實現,所以必須得會點Java,此外,還得熟悉Linux的基本操作,最後能生成Linux32位機的可執行文件,是不是很高大上!這本書的語言原型是簡化版的C語言,如果啃下來嗎,對C語言的理解也會更加深刻!

2.《自己動手寫編譯器、鏈接器》

這本書完全使用C語言,完全手工構造,唯一的遺憾是書寫的不怎麼好(但是隨書代碼最終版是完全沒有問題的,可以執行)。最後能夠生成win32上的可執行文件!這本書感覺比較需要鑽研精神,所以請謹慎上手。

我自己已經入坑了,貼一下目前的進度(GitHub - zhaoyu1995/TCC: Tiny C Language Compiler on Windows)

語法分析(通過格式化表現的):

生成目標文件(這一部分比較難,還在研究)

如果能完成以兩本書上任意一個成就感估計爆表!

不能也沒關係,看下面:

3.《自製編程語言》

這本書藉助大名鼎鼎的lex/yacc分別實現了一個動態類型的語言和一個靜態類型的語言,作者也很牛X,《征服C指針》的作者前橋和彌!這本書,我還沒看,但是從封面看得出來,和上面《自製編譯器》一個系列的(圖靈的「自製」系列,知名度最高的應該就是《30天自製操作系統》啦),內容絕對沒問題,而且圖靈社區有勘誤表,非常有幫助,不像第二本,只能我自己查錯調試。。。

4.《C編譯器剖析》

由於圖書館很坑,竟然放在C語言書裡面而不是編譯原理裡面,今天才發現!沒開始看,但是初略翻了一些,編譯器作者:

是不是瞬間想看了!

看了一下目錄,思路很清晰,感覺應該是題主最需要的

------------------------------------乾貨結束-------------------------------------------

希望對大家有所幫助!默默提醒一下,先把理論掌握差不多再實踐,實踐和理論能力應該是螺旋式上升的,尤其是編譯原理這種理論性很強的科目。

以上。


為啥這麼像我們編譯原理的作業(???)


現弄清楚編譯原理吧,太早寫代碼沒好處


你們學校沒編譯原理課?為什麼不去看課本,非要看技術博客之類的


推薦閱讀:

數學專業轉機器學習,需要哪些計算機和編程方面的積累?
C++ Primer與C++ 大學教程(C++ How to Programming)哪個更好些,應當選擇怎樣的教材?
計算機科學與技術本科專業有哪些核心課程?應該如何安排學習順序?各個課程推薦哪些經典教材?
你所在的計算機科學領域的 big picture 是怎樣的?
計算機網路該如何深入學習?

TAG:計算機科學 | 編譯器 |