編譯器DIY 讀檔案

2021-09-07 13:47:07 字數 1618 閱讀 7599

編譯器的前端詞法分析:將原始檔解析成乙個個的單詞流。為語法分析做準備。

在詞法分析階段,我們要做的就是將詞分出來,而且確定單詞的型別,一般的程式語言的單詞符號能夠份為下面5種:

1.keyword,如int,long等

2.識別符號,用來表示各種名字,如常量名,變數名等

3.常數。各種型別的常數,如12。1.2等

4.運算子:如+,-,*,/等

5.界符,如「,」「;」等

那麼在實際的過程中應該怎樣來區分這5中型別,在後面的文章中我將詳細講到。

詞法分析第一階段。非常明顯,須要從原始檔裡讀取資料。考慮到如今的硬體記憶體都達到了2g及以上的標準,那麼就將所有原始檔讀到記憶體中,並設定指標指向頭位置。那麼在隨後的分詞操作中,將直接操作指標就可以。在其它的編譯器中,非常多型別都是從檔案裡按行讀取然後對該行中的資料進行解析,這樣做的優點就是空間的大大節省,特別是當記憶體緊湊的時候。而我之所以所有讀取,不不過由於硬體的原因,另乙個原因是在隨後的分詞中,我會相對簡單一些。

我們先構造乙個結構用來儲存對原始檔有關的操作:

struct file ;

接著用乙個函式來實現讀取原始檔的操作:

int readsourcefile(char *filename) 

source.filename = filename;

fseek(source.file, 0, seek_end);

source.size = ftell(source.file);

source.first = malloc(source.size + 1);

if (source.first == null)

fseek(source.file, 0, seek_set);

source.size = fread(source.first, 1, source.size, source.file);

fclose(source.file);

source.first[source.size] = end_of_file;

source.cursor = source.first;

return 1;

}

用fseek重定位檔案的指標,ftell來取得指標對於檔案首部的偏移量,從而得出檔案的大小,接著開闢等量的空間,最後對檔案結構體進行賦值

在編譯器中由於要對錯誤進行處理,所以就將全部的出錯函式封裝起來。以便隨時呼叫。

出錯函式:

void error(const char *format, ...)

void warning(const char *format, ...)

最後我們來進行測試:

測試函式:

/*

* debug put all content from source file

* */

void putsrc()

}

主函式:

int main()

到這裡我們完畢了詞法分析的第一步。在下篇文章中就是對原始檔裡的資料進行解析。

編譯器DIY 讀檔案

編譯器的前端詞法分析 將原始檔解析成乙個個的單詞流。為語法分析做準備。在詞法分析階段,我們要做的就是將詞分出來,而且確定單詞的型別,一般的程式語言的單詞符號能夠份為下面5種 1.keyword,如int,long等 2.識別符號,用來表示各種名字,如常量名,變數名等 3.常數。各種型別的常數,如12...

編譯方舟編譯器

環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...

方舟編譯器編譯

目錄環境變數 安裝 ninja 和 gn 編譯成功 總結2019.9.1 編譯華為方舟編譯器原始碼 這篇文章僅僅是關於如何搭建環境並進行編譯。本機環境 ubuntu 16 server.一定要好好看參考文件!建議使用root賬戶操作 先 clone 原始碼華為開源平台 對應的參考文件openarkc...