- 編譯系統(tǒng)透視:圖解編譯原理
- 新設(shè)計(jì)團(tuán)隊(duì)
- 12字
- 2019-01-04 03:30:37
2.4 GCC實(shí)現(xiàn)詞法分析的源代碼
2.4.1 詞法分析源代碼總覽
狀態(tài)轉(zhuǎn)換圖體現(xiàn)出來的規(guī)則最終要落實(shí)在GCC源代碼中。我們先來總覽GCC源代碼中詞法分析的部分程序調(diào)用架構(gòu)圖,如圖2-41所示。

圖2-41 詞法分析函數(shù)調(diào)用圖
狀態(tài)轉(zhuǎn)換圖的指導(dǎo)思想主要體現(xiàn)在架構(gòu)圖中_cpp_lex_direct函數(shù)和cpp_classify_number函數(shù)部分,其中_cpp_lex_direct函數(shù)完成了所有符號(hào)的識(shí)別,從初始狀態(tài)到終態(tài)都是在這里完成的;數(shù)字的識(shí)別相對(duì)比較復(fù)雜,_cpp_lex_direct函數(shù)在識(shí)別到數(shù)字后,先將其存下來,然后在cpp_classify_number函數(shù)中詳細(xì)甄別數(shù)字的具體類型和屬性。除了這兩個(gè)函數(shù)外,其他的部分,有些用來做預(yù)處理(我們會(huì)在第8章詳細(xì)介紹預(yù)處理),另外一些則偏重于工程處理,比如符號(hào)識(shí)別出來后存儲(chǔ)在哪里等。下面我們著重看這兩個(gè)核心函數(shù)的處理過程。
_cpp_lex_direct函數(shù)對(duì)源代碼進(jìn)行遍歷分析,我們先來總體了解此函數(shù)。
進(jìn)入起始狀態(tài)的代碼如下所示:
//代碼路徑:libcpp/lex.c: cpp_token * _cpp_lex_direct (cpp_reader *pfile) { …… fresh_line: // 跳轉(zhuǎn)到下一行繼續(xù)分析字符串 …… buffer = pfile->buffer; // 字符串都存儲(chǔ)在buffer中,這里是準(zhǔn)備獲取字符 …… skipped_white: // 跳過空白繼續(xù)分析字符 …… c = *buffer->cur++; // cur指向的是當(dāng)前正在分析的字符,cur指向下一個(gè)字符 …… }
之后開始分析符號(hào)。
推薦閱讀
- Redis入門指南(第3版)
- Photoshop智能手機(jī)APP UI設(shè)計(jì)之道
- 深度學(xué)習(xí)經(jīng)典案例解析:基于MATLAB
- Python深度學(xué)習(xí)
- Learning Data Mining with Python
- Python程序設(shè)計(jì)(第3版)
- Processing互動(dòng)編程藝術(shù)
- 精通Scrapy網(wǎng)絡(luò)爬蟲
- HTML5 and CSS3 Transition,Transformation,and Animation
- 鋒利的SQL(第2版)
- C語言程序設(shè)計(jì)同步訓(xùn)練與上機(jī)指導(dǎo)(第三版)
- 基于Struts、Hibernate、Spring架構(gòu)的Web應(yīng)用開發(fā)
- RabbitMQ Essentials
- Java程序員面試筆試寶典(第2版)
- Python從入門到精通(第3版)