語義分析-哈工大編譯原理第三次實驗
實驗3 語義分析
實驗目的
1. 鞏固對語義分析的基本功能和原理的認識。
2. 能夠基於語法指導翻譯的知識進行語義分析。
3. 掌握類高階語言中基本語句所對應的語義動作。
4. 理解並處理語義分析中的異常和錯誤。
實驗內容
在語法分析器的基礎上設計實現類高階語言的語義分析器,基本功能如下:
(1) 能分析以下幾類語句,並生成中間程式碼(三地址指令和四元式形式):
Ø 宣告語句(包括變數宣告、陣列宣告、記錄宣告和過程宣告)
Ø 表示式及賦值語句(包括陣列元素的引用和賦值)
Ø 分支語句:if_then_else
Ø 迴圈語句:do_while
Ø 過程呼叫語句
(2)具備語義錯誤處理能力,包括變數或函式重複宣告、變數或函式引用前未宣告、運算子和運算分量之間的型別不匹配(如整型變數與陣列變數相加減)等錯誤,能準確給出錯誤所在位置,並採用可行的錯誤恢復策略。輸出的錯誤提示資訊格式如下:
Error at Line [行號]:[說明文字]
(3)系統的輸入形式:要求能夠通過檔案匯入測試用例。測試用例要涵蓋第(1)條中列出的各種型別的語句,以及第(2)條中列出的各種型別的錯誤。
(4)系統的輸出分為兩部分:一部分是列印輸出符號表。另一部分是列印輸出三地址指令和四元式序列,格式如下圖所示(以輸入語句“while a<b do if c<d then x=y+z else x=y-z”為例):
1 : (j<, a , b , 3 ) if a < b goto 3
2 : ( j , - , - , 11) goto 11
3 : (j<, c , d , 5 ) if c < d goto 5
4 :( j , - , -, 8 ) goto8
5 :( + , y , z , t1) t1 = y + z
6 :( = , t1 , - , x ) x= t1
7 : ( j , - , - , 1 ) goto1
8 : ( - , y, z , t2) t2= y - z
9 : (= , t2 , - , x ) x
10 : ( j , -, - , 1 ) goto 1
11:
除此之外,可以實現一些額外功能,例如自動型別轉換,識別其它型別語義錯誤,如過程返回型別與宣告型別不匹配;過程呼叫時實參與形引數目或型別不匹配;對非陣列型變數使用陣列訪問操作符“[…]”;對普通變數使用過程呼叫操作符“call”;陣列訪問操作符“[…]”中出現非整數等。
圈重點!!!
實驗指導書:http://download.csdn.net/download/qq_32285991/10125108
原始碼:https://github.com/JiayanFighting/SemanticAnalysis