詞法分析器的主要任務是讀入源程序的輸入字符、將它們組成詞素,生成並輸出一個詞法單元序列,每個詞法單元對應於一個詞素。
當詞法分析器發現了一個標識符的詞素時,要將這個詞素添加到符號表中。
其他任務:
- 過濾掉源程序中的注釋和空白。
- 將編譯器生成的錯誤信息與源程序的位置聯系起來。記錄行號等。
詞法分析器的兩個級聯的處理階段:
- 掃描階段:簡單處理,刪除注釋,壓縮空白字符。
- 詞法分析階段:處理掃描階段的輸出並生成詞法單元。
把編譯部分分為詞法分析和語法分析的原因:
- 簡化編譯器的設計。
- 提高編譯器的效率。
- 增強編譯器的可移植性。
三個術語:
- 詞法單元:由一個詞法單元名和一個可選的屬性值構成。
- 模式:一個詞法單元的詞素可能具有的形式。
- 詞素:源程序中的一個字符序列,他和某個詞法單元的模式匹配,並被詞法分析器識別為該詞法單元的一個實例。
大部分詞法單元的類別:
- 每個關鍵字有一個詞法單元。一個關鍵字的模式就是該關鍵字本身。
- 表示運算符的詞法單元。可以表示單個運算符,也可以表示一類運算符。
- 表示所有標識符的詞法單元。
- 一個或多個表示常量的語法單元,比如數字和字面值字符串。
- 每一個標點符號有一個詞法單元,比如左右括號、逗號、分號。
屬性:如果有多個詞素可以和一個模式匹配,那么詞法分析器向編譯器的后續階段提供有關被匹配詞素的附加信息。
詞法錯誤的恢復動作:
- 從剩余的輸入中刪除一個字符。
- 向剩余的輸入中插入一個遺漏的字符。
- 用一個字符來替換另一個字符。
- 交換兩個相鄰的字符 。
恐慌模式恢復:從剩余的輸入中不斷刪除字符,直到詞法分析器能夠在剩余輸入的開頭發現一個正確的詞法單元為止。
在緩沖區為輸入維護兩個指針:
lexemeBegin指針:該指針指向當前詞素的開始處。當前我們正試圖確定這個詞素的結尾。
forward指針:一直掃描,直到發現某個模式被匹配為止。
一旦確定了下一個詞素,forward指針將指向該詞素結尾的字符。詞法分析器記錄屬性並返回詞法單元。然后使lexemeBegin指針指向剛剛找到的詞素之后的一個字符。
forward指針到達緩沖區末尾時,向緩沖區讀入新的字符。
可以在緩沖區末尾添加哨兵標記。