編寫的 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.《自己動手寫編譯器、鏈接器》
如果能完成以兩本書上任意一個成就感估計爆表!
不能也沒關係,看下面:
3.《自製編程語言》這本書藉助大名鼎鼎的lex/yacc分別實現了一個動態類型的語言和一個靜態類型的語言,作者也很牛X,《征服C指針》的作者前橋和彌!這本書,我還沒看,但是從封面看得出來,和上面《自製編譯器》一個系列的(圖靈的「自製」系列,知名度最高的應該就是《30天自製操作系統》啦),內容絕對沒問題,而且圖靈社區有勘誤表,非常有幫助,不像第二本,只能我自己查錯調試。。。
4.《C編譯器剖析》
由於圖書館很坑,竟然放在C語言書裡面而不是編譯原理裡面,今天才發現!沒開始看,但是初略翻了一些,編譯器作者:是不是瞬間想看了!看了一下目錄,思路很清晰,感覺應該是題主最需要的:------------------------------------乾貨結束-------------------------------------------
希望對大家有所幫助!默默提醒一下,先把理論掌握差不多再實踐,實踐和理論能力應該是螺旋式上升的,尤其是編譯原理這種理論性很強的科目。
以上。為啥這麼像我們編譯原理的作業(???)
現弄清楚編譯原理吧,太早寫代碼沒好處
你們學校沒編譯原理課?為什麼不去看課本,非要看技術博客之類的
推薦閱讀:
※數學專業轉機器學習,需要哪些計算機和編程方面的積累?
※C++ Primer與C++ 大學教程(C++ How to Programming)哪個更好些,應當選擇怎樣的教材?
※計算機科學與技術本科專業有哪些核心課程?應該如何安排學習順序?各個課程推薦哪些經典教材?
※你所在的計算機科學領域的 big picture 是怎樣的?
※計算機網路該如何深入學習?