2012-12-28 56 views
0

我正在開發一個類似於C的編譯器,我想知道編譯器如何與系統包含在一起。設計一個編譯器像C

編譯器讀取完整的代碼,並存儲所有包含在一個列表和解析器中包含的包含,讀完當前代碼後?

// file main.c 
#include <stdio.h> // store in one list 

// continue the parse ... 
int main() 
{ 
    return 0; 
} 
// now, read the includes 
// after finish the includes parse, gen code of sources 

// just a sample 
// file stdio.h 
#include <types.h> // store in list 
#include <bios.h> // store in list 

void printf(...) 
{ 
} 

void scanf(...) 
{ 
} 

順便說一句,我developd的系統(僅測試)來讀取包括和,停止解析,閱讀包括...(這是一個令人厭惡的代碼,但是,工作...) (鏈接樣本) - >https://gist.github.com/4399601

btw,什麼是最好的方式來閱讀包括...和包括文件的工作?

+0

我只是跳你沒有嘗試在C語言中實現解析器...有更好的語言,例如Bison – benjarobin

+2

你需要小心的術語。 C不是編譯器,它是一種語言。你想編寫一個C編譯器,或者一個C語言的編譯器嗎? – Mat

+0

或者你想讓一個完整的語言說「Alexa」?如果是這樣,那麼你可以用C或C++或Java創建完整的應用程序,一旦完成,然後用你的語言重構你的代碼。 –

回答

1

C中以#開頭的任何行都由預處理器處理,而不是編譯器處理。預處理器生成編譯器隨後編譯的文件。該文件的內容取決於開發人員和SDK定義的任何內容。

+0

我不覺得這個區別有用,在這裏。例如,一個C編譯器包含一個預處理器,「編譯器」和連接器,但整個事情仍然是一個C編譯器。這個詞被超載。 – GManNickG

+0

@GManNickG預處理既可以是單個編譯器exe中的一個階段,也可以是單獨的程序。重要的是,它發生在別的之前。 – James

5

#include,#define,#ifdef等被稱爲preprocessor的單獨通道處理。它用#include替換包含文件的行。然後將生成的臨時源文本輸入到後續傳遞,如tokenizerparser

+0

而包含預處理輸出*的概念文件可以是一個實際的臨時文件,但一個管道(進程之間)或流(進程內部)也是可行的選項。 –

+0

@BenVoigt謝謝,修正。 –

0

任何與開始是一個預處理器指令..相應代碼獲取在編譯時被取代..彙編的第一階段是這樣的預處理器編譯..

再後來預處理器的輸出(.i文件)是給編輯的後期階段..

編制的後期階段包括詞法分析器,解析器優化器和代碼生成器..

0

如果我從頭開始編寫一個編譯器,我會首先考慮是否哈包括是語言的必要組成部分 - 如果是,您是否必須編寫它,或者您可以使用已有的語言(例如gcc的cpp部分)。畢竟,編譯器的「有趣」部分是編譯代碼的真正目的,而不是通過宏擴展來讀取文件和用其他字符串替換字符串[雖然這當然也很有趣 - 但是你可以寫一次你有一個可以工作的編譯器!]。包含文件的棘手部分不是包含它本身(相當平凡,遞歸,函數),而是#define /#ifdef /#if /#undef的解析,更重要的是, 。

玩得開心!