編譯器寫作之旅
在此 Github 儲存庫中,我記錄了為 C 語言子集編寫自編譯編譯器的旅程。我還寫出了詳細信息,以便如果您想繼續閱讀,將會解釋我所做的事情、原因,以及一些對編譯器理論的引用。
但不要太多理論,我希望這是一趟實踐之旅。
以下是我目前所採取的步驟:
- 第 0 部分:旅程簡介
- 第 1 部分:詞彙掃描簡介
- 第 2 部分:解析簡介
- 第 3 部分:運算子優先級
- 第 4 部分:實際的編譯器
- 第五部分:聲明
- 第 6 部分:變數
- 第 7 部分:比較運算符
- 第 8 部分:If 語句
- 第 9 部分:While 循環
- 第 10 部分:For 循環
- 第 11 部分:函數,第 1 部分
- 第 12 部分:類型,第 1 部分
- 第 13 部分:函數,第 2 部分
- 第 14 部分:產生 ARM 組譯程式碼
- 第 15 部分:指針,第 1 部分
- 第 16 部分:正確宣告全域變數
- 第 17 部分:更好的類型檢查和指標偏移
- 第 18 部分:重溫左值和右值
- 第 19 部分:數組,第 1 部分
- 第 20 部分:字元和字串文字
- 第 21 部分:更多運算符
- 第22部分:局部變數和函數呼叫的設計思路
- 第 23 部分:局部變數
- 第 24 部分:函數參數
- 第 25 部分:函數呼叫與參數
- 第 26 部分:函數原型
- 第 27 部分:回歸測試與驚喜
- 第 28 部分:新增更多運行時標誌
- 第 29 部分:一些重構
- 第 30 部分:設計結構、聯合和枚舉
- 第 31 部分:實現結構,第 1 部分
- 第 32 部分:訪問結構體中的成員
- 第 33 部分:實施工會和會員准入
- 第 34 部分:枚舉和 Typedef
- 第 35 部分:C 預處理器
- 第 36 部分:
break
並continue
- 第 37 部分:Switch 語句
- 第 38 部分:懸掛其他及更多內容
- 第 39 部分:變數初始化,第 1 部分
- 第 40 部分:全域變數初始化
- 第 41 部分:局部變數初始化
- 第 42 部分:類型轉換和 NULL
- 第 43 部分:錯誤修復和更多運算符
- 第 44 部分:恆定折疊
- 第 45 部分:重新審視全域變數聲明
- 第 46 部分:Void 函數參數和掃描更改
- 第 47 部分:
sizeof
的子集 - 第 48 部分:
static
子集 - 第 49 部分:三元運算符
- 第 50 部分:掃蕩,第 1 部分
- 第 51 部分:數組,第 2 部分
- 第 52 部分:指針,第 2 部分
- 第 53 部分:掃蕩,第 2 部分
- 第 54 部分:溢位暫存器
- 第 55 部分:惰性評估
- 第 56 部分:局部數組
- 第 57 部分:掃蕩,第 3 部分
- 第 58 部分:修復指標增量/減量
- 第 59 部分:為什麼它不起作用,第 1 部分
- 第 60 部分:通過三重測試
- 第 61 部分:下一步是什麼?
- 第 62 部分:程式碼清理
- 第 63 部分:使用 QBE 的新後端
- 第 64 部分:6809 CPU 的後端
未來的部分沒有時間表或時間表,所以請繼續檢查這裡,看看我是否還寫了更多內容。
版權
我從 Nils M Holm 編寫的 SubC 編譯器中藉用了一些程式碼和很多想法。他的程式碼屬於公共領域。我認為我的程式碼有很大的不同,我可以對我的程式碼應用不同的許可證。
除非另有說明,
- 所有原始程式碼和腳本均由 (c) Warren Toomey 遵循 GPL3 許可證。
- 所有非原始碼文件(例如英文文件、圖像文件)均由 (c) Warren Toomey 獲得 Creative Commons BY-NC-SA 4.0 授權。