編譯器真的很難。
https://descent-incoming.blogspot.com/2017/01/blog-post.html
這篇描述我的學習方式, 讓你參考看看。
也列出我有購買的編譯器書籍, 看看你有沒有興趣的。
https://descent-incoming.blogspot.com/2018/01/44.html
這幾篇描述我一步步走來的紀錄。
從建立 AST 到輸出組合語言。
最後我也寫了一個簡單的組譯器, 輸出的 elf object file 可以和 gnu ld,
link, 最後我停留在這裡。
這幾篇文章最主要是展示我的學習方式, 也許你有不同的學習之路。
我是建議產生 AST, 有了 AST, 後續的動作會很好處理。
※ 引述《wei115 (NEET)》之銘言:
: 問題(Question):
:
: 我想試試看實作一個C編譯器
: 之前沒有學過編譯器,看了幾個星期的資料後,還是不太懂編譯器
: 不過土法煉鋼,還是煉出了一些東西
: 因為不知道寫一個編譯器的難度,所以簡化一下目標,只做編譯器的前端
: 使用C作為中間語言,希望可以去除語法糖,和格式盡量和組合語言相近,以便後端實做
: 使用遞迴下降方法,沒有多少檢查(int str = "aabbcc"; 是可以的)
: 語法3成參考K&R,7成用猜的,程式碼寫的不夠合理,常常加一個功能就要動到整個專案
: 之後收集更多資料後會全部打掉重練
: 目前有做出int、char的宣告if、while
: 之後想做陣列&指標的功能,但不知道指標的宣告和使用該如何簡化
: 想請各位大大提供一些方向
: 謝謝
: p.s
: 以一個1+...+100的迴圈程式為例
: 輸入:
: int main()
: {
: int a = 101;
: int out = 0;
: while(a = a - 1)
: out = out + a;
: }
: 輸出:
: int r0;int r1;int r2;int r3;int r4;int r5;int r6;int r7;int r8;int r9;int
: r10;int r11;int r12;int r13;int r14;int r15;int r16;int r17;int r18;int r19;
: int main()
: {
: r0 = 101;
: int a = r0;
: r0 = 0;
: int out = r0;
: L0:
: r0 = a;
: r1 = a;
: r2 = 1;
: r3 = r1 - r2;
: r0 = r3;
: a = r3;
: if(!r0) goto L1;
: r4 = out;
: r5 = out;
: r6 = a;
: r7 = r5 + r6;
: r4 = r7;
: out = r7;
: goto L0;
: L1:
: }
: 希望輸入的程式碼可以轉成這種最簡形式
: