編譯器的前端詞法分析:將原始檔解析成乙個個的單詞流。為語法分析做準備。
在詞法分析階段,我們要做的就是將詞分出來,而且確定單詞的型別,一般的程式語言的單詞符號能夠份為下面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...