《編譯原理》學習心得

SimpleLiMengJie發表於2015-07-23

前言

    由於工作原因需要涉及到做一個程式碼翻譯器 (ActionScript3轉TypeScript),由此記錄和分享一下工作中的一些心得。如果你恰巧也需要做一個Lua轉JavaScript或者其它語言的轉換,本文或許可以給你一些提示或幫助。

    翻譯器涉及的核心技術是編譯技術,這方面的書籍很多,有名的龍書、虎書、鯨書,我主要是參考了龍書《編譯原理》這本。簡單說說我讀完前面幾章(只包含編譯器前端)的感受:概念比較多(重要的概念記住就行,沒幾個),演算法不算很多(大概6個),演算法部分不夠詳細(幾行虛擬碼,有得演算法實現起來幾百行),一堆的理論。實用性很高,但是由於不夠詳細,實現的時候細節部分(比如可以推出空的非終結符如何處理)需要在理解演算法原理的基礎上再去寫才能寫正確。


乾貨

    要自己實現一個編譯器有兩種選擇,第一種是自己實現所有的部分,包含編譯器的生成工具、編譯器的執行部分、語法規則表。第二種跟第一種的差別是編譯器的生成工具是不需要自己寫的,可以利用現有的專案,如gcc。我是選擇了第一種,全部都自己搞,這樣也可以理解的更深刻些。

   

    編譯器的前端現在看來(被提煉之後)主要講得就是幾個概念和六個演算法。

    概念: 詞法分析器、語法分析器、正規表示式、NFA、DFA、詞法單元、語法樹

    演算法:1)  正規表示式 轉 NFA  (詞法分析)

               2)  NFA 轉 DFA (詞法分析)

               3)  最小化DFA狀態數 (詞法分析)

               4)構造 LR0 語法 (語法分析)

               5)構造 LR1 語法  (這一步只需要看,可以不用實現)  (語法分析)

               6)構造 LALR1 語法  (語法分析)

    

    具體實施的話,大概需要如下步驟:

    1. 購入一本編譯原理的書籍,首推《編譯原理》第三版。(別的虎書,鯨書可以百度搜尋下區別,我也沒看過,沒有發言權)

        以下以《編譯原理》這本書為例,列出餘下步驟。

    2. 跳過第一章,直接進入第二章(一個簡單的語法制導翻譯器),這一章不需要完全看懂,只要瞭解大概的過程和一些概念即可,至少要知道編譯器的前端是由兩個核心組成(詞法分析器和語法分析器)即可。這一章也不需要手動練習什麼。

    3. 進入第三章(詞法分析),3.1 - 3.2節看看即可(瞭解有這麼一回事),學習後面的部分,可以先在草稿上演算,然後再寫成程式碼。

    4. 進入第四章(語法分析),4.1 - 4.6都只需要看一下,如果有時間可以在草稿上演算LL語法分析器,重點是4.7 - 4.9,這部分也需要在草稿上進行大量的演算,特別是寫演算法的時候,需要跟演算同時進行,有時候想不通就拿個實際的例子打打草稿,基本上都是邊寫演算法邊打草稿的節奏。

    5. 第五章可以不用怎麼看,如果你知道語法分析的過程中怎麼生成語法樹和處理語法結構(其實就是寫在YACC配置檔案後面的補充程式碼),這一章可以不用看。

    6. 把源語言的語法結構理清楚,整理成一張圖,比如AS3的語法結構圖:(這個圖並不完全)

    

     像這樣把語法結構先理清楚後,詞法分析中的正規表示式如何寫,以及語法分析器的語法規則如何寫已經一清二楚了。

     之後就是前端的其它部分了,沒有統一的規則,大概就是把語法結構存起來之後逐步分析每一個表示式,分析出每一個表示式的型別,型別檢查等等。最後就是列印了,生成想要的語言格式。


     最後附上我自制的《編譯原理》PPT,沒有弄完,弄了詞法分析部分,語法分析沒怎麼弄。http://download.csdn.net/detail/jiexiaopei_2004/8927671

相關文章