編譯器設計中的詞法分析設計是什麼?
詞法分析可以使用狀態轉換圖來設計。
有限自動機(狀態轉換圖) - 用於識別詞元的定向圖或流程圖。
狀態轉換圖有兩個部分:
狀態 - 用圓圈表示。
邊 - 狀態由邊(箭頭)連線。
示例 - 繪製“if”關鍵字的狀態轉換圖。
為了識別詞元(“if”),詞法分析必須讀取“f”之後的下一個字元。根據下一個字元,它將判斷是“if”關鍵字還是其他內容。
因此,“if”後的空格決定“If”是一個關鍵字。
最終狀態3上的“*”表示回退,即控制將再次回到之前的狀態2。因此,空格不是詞元(“if”)的一部分。
識別符號的狀態轉換圖 - 識別符號以字母開頭,後跟字母或數字。狀態轉換圖將是
例如,在語句**int a2;**中,識別符號**a2**的狀態轉換圖將是
由於(;)不是識別符號(“a2”)的一部分,因此使用“*”進行回退,即返回到狀態1以識別識別符號(“a2”)。
識別符號的狀態轉換圖可以轉換為程式程式碼,如下所示:
編碼
State 0: C = Getchar() If letter (C) then goto state 1 else fail State1: C = Getchar() If letter (C) or Digit (C) then goto state 1 else if Delimiter (C) goto state 2 else Fail State2: Retract () return (6, Install ());
在狀態2中,回退()將指標向後移動一個狀態,即到狀態1,並宣告到狀態1為止找到的任何內容都是一個詞元。
詞法分析將詞元返回給語法分析器,不是以英文單詞的形式,而是以對的形式,即(整數程式碼,值)。
對於識別符號,返回給語法分析器的整數程式碼為6,如表所示。
Install() - 它將返回指向符號表的指標,即詞元的地址。
下表顯示了詞法分析返回給語法分析器的各種詞元的整數程式碼和值。
不同詞元的整數程式碼
詞元 | 整數程式碼 | 值 |
---|---|---|
Begin | 1 | - |
End | 2 | - |
If | 3 | - |
Then | 4 | - |
Else | 5 | - |
識別符號 | 6 | 指向符號表的指標 |
常量 | 7 | 指向符號表的指標 |
< | 8 | 1 |
<= | 8 | 2 |
= | 8 | 3 |
<> | 8 | 4 |
> | 8 | 5 |
>= | 8 | 6 |
這些整數值不是固定的。不同的程式設計師在設計詞法分析時可以選擇其他整數程式碼和值。
假設,如果**識別符號**儲存在符號表中的位置236,則
類似地,如果**常量**儲存在位置238,則
整數程式碼 = 7
Install()= 238 即,對將是(7,238)
詞元的狀轉換圖(有限自動機):
廣告