1. 程式人生 > >語義分析-哈工大編譯原理第三次實驗

語義分析-哈工大編譯原理第三次實驗

實驗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 , zt1)            t1 = y + z

6  :( = , t1 ,  - ,  x )          x= t1

7  : (  j , - ,  - ,  1 )        goto1

8  : (  - ,  y, zt2)        t2= y - z

9  : (= ,  t2 ,  - , x )           x

= t2

10 : ( j  ,   -,  - , 1 )          goto 1

11:

除此之外,可以實現一些額外功能,例如自動型別轉換,識別其它型別語義錯誤,如過程返回型別與宣告型別不匹配;過程呼叫時實參與形引數目或型別不匹配;對非陣列型變數使用陣列訪問操作符“[…]”;對普通變數使用過程呼叫操作符“call”;陣列訪問操作符“[…]”中出現非整數等。

圈重點!!!

實驗指導書:http://download.csdn.net/download/qq_32285991/10125108

原始碼:https://github.com/JiayanFighting/SemanticAnalysis