編譯程序總框
詞法分析器的設計
詞法分析的任務:
從左至右逐個字符地對源程序進行掃描,產生一個個單詞符號,
詞法分析器(Lexical Analyzer):掃描器(Scanner),執行詞法分析的程序
功能:輸入源程序、輸出單詞符號
單詞符號的種類:
-
基本字:如 begin,repeat,for,…
-
標識符:用來表示各種名字,如變量名、數組名和過程名
-
常數:各種類型的常數
-
運算符:+,-,*,/,…
-
界符:逗號、分號、括號和空白
-
輸出的單詞符號的表示形式
- (單詞種別,單詞自身的值)
-
單詞種別通常用整數編碼表示
- 若一個種別只有一個單詞符號,則種別編碼就代表該單詞符號。假定基本字、運算符和界符都是一符一種。
- 若一個種別有多個單詞符號,則對於每個單詞符號,給出種別編碼和自身的值。
- 標識符單列一種;標識符自身的值表示成按機器字節划分的內部碼
- 常數按類型分種;常數的值則表示成標准的二進制形式
詞法分析作為一個獨立的階段: 結構簡潔、清晰和條理化,有利於集中考慮詞法分析一些枝節問題,但不一定不作為單獨的一遍,將其處理為一個子程序
詞法分析器的結構
單詞符號的識別:超前搜索
標識符識別:字母開頭的字母數字串,后跟界符或算符
常數識別:識別出算術常數並將其轉變為二進制內碼表示
算符和界符的識別:把多字符組成的算符和界符拼合成一個單詞符號
幾點限制——不必使用超前搜索
- 所有基本字都是保留字;用戶不能用它們作自己的標識符
- 基本字作為特殊的標識符來處理,使用保留字表
- 如果基本字、標識符和常數(或標號)之間沒有確定的運算符或界符作間隔,則必須使用一個空白符作間隔
狀態轉換圖
狀態轉換圖是一張有限方向圖,結點代表狀態,用圓圈表示,狀態之間用箭弧連結,箭弧上的標記(字符)代表射出結狀態下可能出現的輸入字符或字符類,一張轉換圖只包含有限個狀態,其中有一個為初態,至少要有一個終態,狀態轉換圖可用於識別(或接受)一定的字符串若存在一條從初態到某一終態的道路,且這條路上所有弧上的標記符連接成的字等於α,則稱α被該狀態轉換圖所識別(接受)
狀態轉換圖的實現
全局變量與過程
- ch 字符變量,存放最新讀入的源程序字符
- strToken 字符數組,存放構成單詞符號的字符串
- GetChar 子程序過程,把下一個字符讀入到 ch 中
- GetBC 子程序過程,跳過空白符,直至 ch 中讀入一非空白符
- Concat 子程序,把ch中的字符連接到 strToken
- IsLetter和 IsDisgital 布爾函數,判斷ch中字符是否為字母和數字
- Reserve 整型函數,對於 strToken 中的字符串查找保留字表,若它是保留字則給出它的編碼,否則回送0
- Retract 子程序,把搜索指針回調一個字符位置
- InsertId 整型函數,將strToken中的標識符插入符號表,返回符號表指針
- InsertConst 整型函數過程,將strToken中的常數插入常數表,返回常數表指針
詞法分析器的實現
將狀態圖的代碼一般
變量curState用於保存現有的狀態,用二維數組表示狀態圖:stateTrans[state][ch]