官术网_书友最值得收藏!

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)。

主站蜘蛛池模板: 寿光市| 景泰县| 金湖县| 通州区| 寿光市| 湖州市| 蚌埠市| 眉山市| 水富县| 轮台县| 西乡县| 阿坝| 巴马| 罗江县| 义马市| 孝义市| 宕昌县| 岐山县| 邯郸县| 台北市| 浦县| 吕梁市| 博乐市| 齐河县| 万荣县| 西充县| 福海县| 宜黄县| 格尔木市| 汕头市| 饶阳县| 原阳县| 华宁县| 台湾省| 金湖县| 宁阳县| 兴山县| 江达县| 建德市| 盐城市| 平乡县|