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

2.4 GCC實現詞法分析的源代碼

2.4.1 詞法分析源代碼總覽

狀態轉換圖體現出來的規則最終要落實在GCC源代碼中。我們先來總覽GCC源代碼中詞法分析的部分程序調用架構圖,如圖2-41所示。

圖2-41 詞法分析函數調用圖

狀態轉換圖的指導思想主要體現在架構圖中_cpp_lex_direct函數和cpp_classify_number函數部分,其中_cpp_lex_direct函數完成了所有符號的識別,從初始狀態到終態都是在這里完成的;數字的識別相對比較復雜,_cpp_lex_direct函數在識別到數字后,先將其存下來,然后在cpp_classify_number函數中詳細甄別數字的具體類型和屬性。除了這兩個函數外,其他的部分,有些用來做預處理(我們會在第8章詳細介紹預處理),另外一些則偏重于工程處理,比如符號識別出來后存儲在哪里等。下面我們著重看這兩個核心函數的處理過程。

_cpp_lex_direct函數對源代碼進行遍歷分析,我們先來總體了解此函數。

進入起始狀態的代碼如下所示:

//代碼路徑:libcpp/lex.c:
cpp_token *
_cpp_lex_direct (cpp_reader *pfile)
{
  ……
  fresh_line:                                // 跳轉到下一行繼續分析字符串
  ……
  buffer = pfile->buffer;                 // 字符串都存儲在buffer中,這里是準備獲取字符
  ……
  skipped_white:                             // 跳過空白繼續分析字符
  ……
  c = *buffer->cur++;                     // cur指向的是當前正在分析的字符,cur指向下一個字符
  ……
}

之后開始分析符號。

主站蜘蛛池模板: 赤壁市| 佳木斯市| 柯坪县| 叙永县| 达州市| 衡阳县| 浦北县| 张家界市| 电白县| 鹤山市| 仁怀市| 六枝特区| 浮山县| 青海省| 永平县| 高密市| 珲春市| 双辽市| 东阳市| 棋牌| 大埔区| 宜城市| 三河市| 庄浪县| 卢湾区| 内黄县| 巴马| 凤翔县| 诸城市| 阳山县| 兴城市| 饶河县| 崇仁县| 桃源县| 白银市| 明光市| 巴林左旗| 武汉市| 晴隆县| 武邑县| 行唐县|