一個簡單的編譯原理詞法語法語義分析程式
這是我們學校的課程實驗,想做個學習記錄,所以發表了這篇部落格,有不足的地方,歡迎大家共同探討,也歡迎大家轉載,轉載時請務必註明作者,希望對想學習編譯原理的同學有一定的幫助。
一 語法結構的詞法說明
- 關鍵字:begin if while 和檔案結束符EOF。
- 運算子和界符:= + - * / < <= > >= ; ( ) { } /* */
- 其他單詞是識別符號(ID)和整型常數(NUM),通過以下正規式定義:
ID = letter(letter|digit)*
NUM = digit digit* - 空格由空白、製表符和換行符組成。空格一般用來分隔ID、NUM、運算子、界符和關鍵字,詞法分析階段通常被忽略
二 上下文無關文法描述
用擴充的BNF表示如下:
(1) <程式> : : = begin<語句串>EOF
(2) <語句串> : : = <語句> {; <語句>}
(3) <語句> : : = <賦值語句>
(4) <賦值語句> : : = ID = <表示式>
(5) <表示式> : : = <項>{+ <項>|- <項>}
(6) <項> : : = <因子>{* <因子>| / <因子>}
(7) <因子> : : = ID | NUM | (<表示式>)
三 單詞的種別編碼方案
四 詞法分析程式的主要演算法思想
主程式示意圖:
詞法分析程式流程:
五 語法語義分析方法的演算法思想的詳細描述
該語法語義分析是同時進行的即在語法分析的同時也進行著語義分析,採用的是遞迴下降語法制導翻譯法,程式的入口示意圖:
這裡的語句串分析函式在程式中定義為yucu函式,其分析過程示意圖為:
statement函式為語句串分析函式,其語句串分析過程示意圖如下:
condition函式是處理if和while條件語句的函式,其處理過程如下:
在上面的statement_Block函式是語句塊分析函式,其分析的是被“{”和 “}”包圍的程式段,其分析過程為:
expression函式是處理表達式語句的函式,其分析過程如下圖:
term分析函式示意圖:
factor分析過程示意圖:
需要注意的是在遇到if 和 while 的時候需要採用回填函式,例如 (1)if a<b goto address
,生成(1)時,這個address轉移地址是未知的,只有等分析完if後面{ }裡面的程式時才能回填這個值,這就要定義一個值nextgoto記錄{ }裡生成的最後一個四元式所在地址,因為{ }裡面的程式是由statement_Block函式處理的,所以在分析到 “}”時就將nextgoto+1回填到(1)中的address裡面,還需要注意的是if和while是有區別的,while是迴圈的,if則沒有。
還有要提出來的是這份程式沒有解決巢狀的問題,巢狀之後會出錯,
測試資料:
測試結果:
測試資料:
測試結果:
僅供學習參考,另附原始碼地址