《吉林大學編譯原理課件第六章.ppt》由會員分享,可在線閱讀,更多相關《吉林大學編譯原理課件第六章.ppt(26頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、語義分析和符號表,主要內(nèi)容: 語義分析概述(必要性、功能、描述方法) 符號表 類型表達式 聲明和程序體的語義分析,語義分析的必要性,語法和語義的區(qū)別; 語法:關于什么樣的字符串才是該語言 在組成結構上合法的程序的法則。 語義:關于結構上合法的程序的意義的 法則。,語義分析的分類,語義種類 靜態(tài)語義:在編譯階段(從程序文本上)可 以檢查的語義。 動態(tài)語義:通過程序的執(zhí)行才能檢查的語 義。,語義錯誤 各種條件表達式的類型是不是boolean型? 運算符的分量的類型是否相容? 賦值語句的左右部的類型是否相容? 形參和實參的類型是否相容? 下標表達式的類型是否為所允許的類型?
2、 變體記錄中表示情形的常量是否為合法類型? 函數(shù)說明中的函數(shù)類型和返回值的類型是否一致? VE中的V是不是變量,而且是數(shù)組類型? V.id中的V是不是變量,而且是記錄類型? id是不是該記錄類型中的域名? V中的V是不是指針或文件變量? y+f(....)中的f是不是函數(shù)名?形參個數(shù)和實參個數(shù)是否一致? p(....)語句中的p是不是過程名?形參個數(shù)和實參個數(shù)是否一致? 每個使用性標識符是否都有聲明?在同層內(nèi)有無標識符被聲明多次? 標號是否有聲明?有無重復聲明和重復定位錯誤?有無非法轉入錯誤? 子界類型中的下界和上界類型是否相容?下界是否小于等于上界?,語義分析的內(nèi)容: 類型分析; 標
3、識符相關信息; 語義分析的功能: 檢查語義錯誤 構造標識符屬性表(符號表) 語義分析的實現(xiàn): 與語法分析相結合,語義分析的功能圖示,語義分析,,語法分析樹,TokenList,,語義定義,,自然語言描述規(guī)定,,符號表,,判定,標識符的內(nèi)部表示 類型的內(nèi)部表示 值的內(nèi)部表示,三種內(nèi)部表示,Code,標識符的內(nèi)部表示,標識符種類: 常量名、類型名、變量名、函數(shù)名、過程名、域名。 TYPE idkind=( consKind, typeKind, varKind, fieldKind, procKind,funcKind ) 內(nèi)部表示(AttributeIR): 常
4、量: 類型: 變量: 域名*: 過函:,Value,Kind,TypePtr,,,,,,,Forward,Kind,TypePtr,,,,,,,Off,Level,Access,Kind,TypePtr,,,,,,,HostType,Off,Kind,TypePtr,,,,,,,Size,Forward,Class,Parm,Level,Kind,TypePtr,,,,,,,,Off,例有聲明如下: CONST pai= 3.14 ; TYPE vector=ARRAY1..10 OF integer; VAR x, y : real ; r, s : vector ; 設當
5、前層數(shù)和可用offset值分別為L和0,構造標識符 pai, vector, x, y, r 和s 的屬性表示。,類型的內(nèi)部表示,類型的種類:標準、子界、枚舉、數(shù)組、記錄、 集合、文件、指針類型等等。 TypeKind=(intTy,boolTy,charTy,realTy,enumTy, subTy,arrayTy,recordTy,setTy,fileTy,pointerTy) 內(nèi)部表示:(TypeIR) 標準類型: sub: enum: array:,Up,Low,HostType,Kind,Size,,,,,,,Leng,Elems,Kind,Size,,,,,,,E
6、lemType,IndexType,Kind,Size,,,,,,,Kind,Size,,,,,record: FixBody: VariBody: set: file: pointer:,,VariBody,FixBody,Kind,Size,,Next,Off,FixUnitType,id,,,,,,,VariUnits,CaseUnit,,,,,,Next,VariBody,FixBody,,,,,,,,,,BaseType,Kind,Size,,,,,CompType,Kind,Size,,,,,,TypeName,Kind,Size,,,,,,例有如下的類型定義: at
7、= ARRAY 1..10 OF ARRAY1..100 OF integer; rt = RECORD x : real ; a : at; CASE u: boolean OF false:(k : integer); true:(y: real; b: boolean) END 構造類型的內(nèi)部表示。,值的內(nèi)部表示,非結構類型值的內(nèi)部表示: 實型: 指針: 有序類型:整數(shù)形式,有序類型的常量表示: 整型常量:ord(N) = N 布爾常量:ord(false)=0, ord(true) = 1 字符常量:ord(C) = ASC (C) 枚舉常量:設有枚舉類
8、型(D,A,B),則有 ord(D)=0,ord(A)=1,ord(B)=2 子界常量:設有子界類型C1..C2,則值空間 為ord(C1)...ord(C2),符號表,標識符的作用: 聲明部分:定義了各種對象及對應的屬性和 使用規(guī)則。 程序體:對所定義的對象進行各種操作。,$id,idname,Idname,AttributeIR,必要性 Token: 新表符號表(種類、類型等信息):,有關符號表的操作: 添加、作用域刪除、查詢 處理符號表的模塊: 定義符號表數(shù)據(jù)結構 定義符號表上的操作,符號表,符號表的作用:為語義檢查和代碼生成提供 標識符的語
9、義信息。 標識符的處理思想: 遇到定義性標識符時,在符號表中填寫 被定義標識符的符號項; 當遇到使用性標識符時,用該標識符查 符號表求得其屬性。,標識符的特點,標識符的作用域:標識符有效的最大程序段 嵌套作用域規(guī)則:當存在標識符的嵌套聲明時,最近定義的屬性為標識符的當前屬性 局部化單位:允許有聲明的程序段,,,,P:,Var x ,y,z,,,,Var x,m,n,x:=1; m:=x+1;,y:=x+1;,x:=0;,Q:,局部化區(qū)入口,Proc p( Func f( 形式過/函 p( f( Record begin,符號表的種類:全局符號表、局部符號表 原則: 進入一個局
10、部化區(qū)時,記錄本層符號表的位置 遇到定義性標識符時,構造其語義信息,查本層符號表,若存在,則有重復聲明錯誤,否則將語義信息填入表中 遇到一個使用性標識符時,查表(從里層到外層),查不到則有未定義標識符錯誤,否則構造新的TOKEN 退出一個局部化區(qū)時,作廢本層符號表,標識符處理的原則,符號表的實現(xiàn),用局部符號表實現(xiàn) proc p:x,y,z proc p1:x,y1,z1 proc p2:y y,z x,y1,z1,y proc p3:z,a x,y,a x,z,,,,,,,,,,,,,符號表的實現(xiàn),用全局符號表實現(xiàn) proc p0:x,y proc p1:x,z y proc p2:x1,y1
11、 y x,z,,,,,,,,,,語義分析例子,program p() type at=array1..100 of array1..10 of inteter var x:real; a:at; i:integer; proc p1(var a1:at; a2:at) var x:integer; a:real; proc p2(n:integer) var m:1..50; x:real; m,n,x(使用性出現(xiàn)) end a1,a2,x,a,i(使用性出現(xiàn)) end x,a,i(使用性出現(xiàn)) end,,,,,,,,,,標號的語義分析,標號出現(xiàn)的位置: 標號聲明:label 1, 2, ,
12、 n; 標號定位(語句前):i:Statement; 標號使用(Goto后):goto i; 標號部分的語義錯誤: 標號重復聲明; 標號重復定位; 標號有定位而無聲明; 標號有使用而無定位; Goto語句有非法轉入.,標號部分語義分析原理,設置五種表:LDEC,LDEF,LUSE,SL,PL LDEC表:(Flag, Label,); LDEF、LUSE表:(Label); SL表:(kind,LDEFaddr,LUSEaddr); PL表:(LDECaddr,LDEFaddr); 標號的語義分析原理 1)進入一個過/函時,將本層LDEC和LDEF的地址填入PL表; 2)遇到
13、一個標號聲明“l(fā)abel 1, 2,,n”時,建立本層LDEC表(檢查重復聲明錯誤),其中的Flag標志均設置為0; 3)遇到定位性標號“:Statement”時: 檢查在LDEC表中有無 ,若無則表示無標號聲明錯誤; 若有,則檢查其Flag位,若是1,則有重復定位錯誤; 若Flag=0,令其Flag位為1,并將 填入LDEF表中。 查看LUSE表,若其中有則將其刪除掉。,4)進入一個結構語句時,將本語句的LDEF和LUSE表位置填入SL表; 5)遇到一個“goto ” 時: 查看LDEF表,看其中是否有; 若無,將填入LUSE表; 6)退出一個結構化語句時: 清查本層LUSE表(若有定位則刪除該項):用本層的LUSE中標號查本層定位表,若查到,則把該項從LUSE中刪除; 作廢本層的LDEF。 7)退出一個過/函時: 清查本層LUSE表; 作廢本層的LDEC和LDEF。 8)程序結束時,清查LUSE表,若非空,則說明有標號為定位的錯誤。,