3. 詞法分析器的設計
4. 狀態轉換圖
5. 參考文獻
今天學習了編譯原理中的詞法分析
這一章節,我參考了國防工業出版社《編譯原理》教材1
和中國大學mooc-國防科技大學《編譯原理》的ppt,整理了這一章的內容,希望能夠理解這部分的知識。
figure 1. 編譯流程
\text
figure 1.
編譯流程
詞法分析器(lexical analyzer)
單詞符號的種類
單詞種別通常用整數編碼表示
figure 2. 詞法分析器在編譯器中地位
\text
figure 2.
詞法分析器在編譯器中地位
詞法分析器工作的第一步是輸入源程式文字。輸入串一般是放在乙個緩衝區中,這個緩衝區稱輸入縵沖區
。詞法分析的工作(單詞符號的識別)可以直接在這個緩衝區
中進行。但在許多情況下,把輸入串預處理一下,對單詞符號的識別工作將是比較方便的。
我們可以設想乙個預處理子程式
,它能夠完成去除空白符、換行符和注釋還有合併界符等任務。
每當詞法分析器呼叫它時,它就處理出一串確定長度(如120個字元)的輸入字元,並將其裝進詞法分析器所指定的緩衝區中(稱為掃瞄緩衝區
)。這樣,分析器就可以在此緩衝區中直接進行單詞符號的識別,而不必管其他繁瑣事物。
figure 3. 詞法分析器的結構
\text
figure 3.
詞法分析器的結構
分析器對掃瞄緩衝區進行掃瞄時一般用兩個指示器
,乙個指向當前正在識別的單詞的開始位置
(指向新單詞的首字元),另乙個用於向前搜尋以尋找單詞的終點。
不論掃瞄緩衝區
設得多大都不能保證單詞符號不會被它的邊界所打斷。因此,掃瞄緩衝區最好使用乙個一分為二的區域
。並對識別符號和常數的長度加以限制
(例如,不得多於120個字元)。否則,即使緩衝區再大也無濟於事。
figure 4. 掃瞄緩衝區
\text
figure 4.
掃瞄緩衝區
如以下fortran語句,使用者可以重新定義關鍵字,編譯器就需要超前掃瞄都關鍵字後的數字格式才能知道其詞性。
figure 5. 超前搜尋
\text
figure 5.
超前搜尋
除了關鍵字需要超前搜尋,識別符號、常數、算符和界符等也可能會需要超前搜尋。
識別符號識別
字母開頭的字母數字串,後跟界符或算符
常數識別
識別出算術常數並將其轉變為二進位制程式碼頁示,如
5. eq
.m5.eq.m
5.eq.m
5. e08
5.e08
5.e0
8算符和界符的識別
把多字元組成的算符和界符拼合成乙個單詞符號
: =,
∗∗,.
eq.,
++,−
−,>
=:=, **, .eq. , ++,--,>=
:=,∗∗,
.eq.
,++,
−−,>
=由於超前搜尋這個問題的存在,現在的程式語言大多加入了一些限制,從而避免超前搜尋。
所有基本字都是保留字;使用者不能用它們作自己 的識別符號
基本字作為特殊的識別符號來處理,使用保留字表
如果基本字、識別符號和常數(或標號)之間沒有確 定的運算子或界符作間隔,則必須使用乙個空白符作間隔,如: do99
k=1,
10do99k=1,10
do99k=
1,10
要寫成do99
k=1,
10do \hspace* 99 \hspace* k=1,10
do99k=
1,10
使用狀態轉換圖是設計詞法分析器的一種好途徑。轉換圖是一張有限方向圖,可用於識別(或接受)一定的字串。
在狀態轉換圖中,
例如,圖6表示,從初態進入狀態1,若讀入字元則進入狀態2,若讀入數字則進入狀態3。
figure 6. 狀態轉換圖
\text
figure 6.
狀態轉換圖
圖7中終態節點右上角的星號表示讀入其他字元後需要回退到上乙個輸入,即最終識別出的結果不包含除數字以外的其他字元。
figure 7. 識別整常數的狀態轉換圖
\text
figure 7.
識別整常數的狀態轉換圖
圖8是乙個詞法分析器的設計示例
figure 8. 詞法分析器的設計示例
\text
figure 8.
詞法分析器的設計示例
注:部分內容整理自國防工業出版社《編譯原理》教材和中國大學mooc-國防科技大學《編譯原理》ppt
[1] 陳火旺. 編譯原理 [m]. 北京 : 國防工業出版社, 2010.
github:
編譯原理詞法分析
編譯原理實驗一 詞法分析練習 include include include define tokenmax 100 define progmax 1000 define k esc 27 void analytics 詞法分析 void scanner 輸入掃瞄 bool isletter cha...
詞法分析(編譯原理)
詞法分析 英語 lexical analysis 是電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer,簡稱lexer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...
編譯原理詞法分析
1 注意識別符號和無符號整數的重複問題,本人採用map解決。2 cin ch自動忽略空白字元。include include include include using namespace std struct pairs int isboundaries char ch return 3 case...