《吉林大學(xué)編譯原理課件第六章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《吉林大學(xué)編譯原理課件第六章.ppt(26頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、語義分析和符號(hào)表,主要內(nèi)容: 語義分析概述(必要性、功能、描述方法) 符號(hào)表 類型表達(dá)式 聲明和程序體的語義分析,語義分析的必要性,語法和語義的區(qū)別; 語法:關(guān)于什么樣的字符串才是該語言 在組成結(jié)構(gòu)上合法的程序的法則。 語義:關(guān)于結(jié)構(gòu)上合法的程序的意義的 法則。,語義分析的分類,語義種類 靜態(tài)語義:在編譯階段(從程序文本上)可 以檢查的語義。 動(dòng)態(tài)語義:通過程序的執(zhí)行才能檢查的語 義。,語義錯(cuò)誤 各種條件表達(dá)式的類型是不是boolean型? 運(yùn)算符的分量的類型是否相容? 賦值語句的左右部的類型是否相容? 形參和實(shí)參的類型是否相容? 下標(biāo)表達(dá)式的類型是否為所允許的類型?
2、 變體記錄中表示情形的常量是否為合法類型? 函數(shù)說明中的函數(shù)類型和返回值的類型是否一致? VE中的V是不是變量,而且是數(shù)組類型? V.id中的V是不是變量,而且是記錄類型? id是不是該記錄類型中的域名? V中的V是不是指針或文件變量? y+f(....)中的f是不是函數(shù)名?形參個(gè)數(shù)和實(shí)參個(gè)數(shù)是否一致? p(....)語句中的p是不是過程名?形參個(gè)數(shù)和實(shí)參個(gè)數(shù)是否一致? 每個(gè)使用性標(biāo)識(shí)符是否都有聲明?在同層內(nèi)有無標(biāo)識(shí)符被聲明多次? 標(biāo)號(hào)是否有聲明?有無重復(fù)聲明和重復(fù)定位錯(cuò)誤?有無非法轉(zhuǎn)入錯(cuò)誤? 子界類型中的下界和上界類型是否相容?下界是否小于等于上界?,語義分析的內(nèi)容: 類型分析; 標(biāo)
3、識(shí)符相關(guān)信息; 語義分析的功能: 檢查語義錯(cuò)誤 構(gòu)造標(biāo)識(shí)符屬性表(符號(hào)表) 語義分析的實(shí)現(xiàn): 與語法分析相結(jié)合,語義分析的功能圖示,語義分析,,語法分析樹,TokenList,,語義定義,,自然語言描述規(guī)定,,符號(hào)表,,判定,標(biāo)識(shí)符的內(nèi)部表示 類型的內(nèi)部表示 值的內(nèi)部表示,三種內(nèi)部表示,Code,標(biāo)識(shí)符的內(nèi)部表示,標(biāo)識(shí)符種類: 常量名、類型名、變量名、函數(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 ; 設(shè)當(dāng)
5、前層數(shù)和可用offset值分別為L和0,構(gòu)造標(biāo)識(shí)符 pai, vector, x, y, r 和s 的屬性表示。,類型的內(nèi)部表示,類型的種類:標(biāo)準(zhǔn)、子界、枚舉、數(shù)組、記錄、 集合、文件、指針類型等等。 TypeKind=(intTy,boolTy,charTy,realTy,enumTy, subTy,arrayTy,recordTy,setTy,fileTy,pointerTy) 內(nèi)部表示:(TypeIR) 標(biāo)準(zhǔn)類型: 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 構(gòu)造類型的內(nèi)部表示。,值的內(nèi)部表示,非結(jié)構(gòu)類型值的內(nèi)部表示: 實(shí)型: 指針: 有序類型:整數(shù)形式,有序類型的常量表示: 整型常量:ord(N) = N 布爾常量:ord(false)=0, ord(true) = 1 字符常量:ord(C) = ASC (C) 枚舉常量:設(shè)有枚舉類
8、型(D,A,B),則有 ord(D)=0,ord(A)=1,ord(B)=2 子界常量:設(shè)有子界類型C1..C2,則值空間 為ord(C1)...ord(C2),符號(hào)表,標(biāo)識(shí)符的作用: 聲明部分:定義了各種對(duì)象及對(duì)應(yīng)的屬性和 使用規(guī)則。 程序體:對(duì)所定義的對(duì)象進(jìn)行各種操作。,$id,idname,Idname,AttributeIR,必要性 Token: 新表符號(hào)表(種類、類型等信息):,有關(guān)符號(hào)表的操作: 添加、作用域刪除、查詢 處理符號(hào)表的模塊: 定義符號(hào)表數(shù)據(jù)結(jié)構(gòu) 定義符號(hào)表上的操作,符號(hào)表,符號(hào)表的作用:為語義檢查和代碼生成提供 標(biāo)識(shí)符的語
9、義信息。 標(biāo)識(shí)符的處理思想: 遇到定義性標(biāo)識(shí)符時(shí),在符號(hào)表中填寫 被定義標(biāo)識(shí)符的符號(hào)項(xiàng); 當(dāng)遇到使用性標(biāo)識(shí)符時(shí),用該標(biāo)識(shí)符查 符號(hào)表求得其屬性。,標(biāo)識(shí)符的特點(diǎn),標(biāo)識(shí)符的作用域:標(biāo)識(shí)符有效的最大程序段 嵌套作用域規(guī)則:當(dāng)存在標(biāo)識(shí)符的嵌套聲明時(shí),最近定義的屬性為標(biāo)識(shí)符的當(dāng)前屬性 局部化單位:允許有聲明的程序段,,,,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,符號(hào)表的種類:全局符號(hào)表、局部符號(hào)表 原則: 進(jìn)入一個(gè)局
10、部化區(qū)時(shí),記錄本層符號(hào)表的位置 遇到定義性標(biāo)識(shí)符時(shí),構(gòu)造其語義信息,查本層符號(hào)表,若存在,則有重復(fù)聲明錯(cuò)誤,否則將語義信息填入表中 遇到一個(gè)使用性標(biāo)識(shí)符時(shí),查表(從里層到外層),查不到則有未定義標(biāo)識(shí)符錯(cuò)誤,否則構(gòu)造新的TOKEN 退出一個(gè)局部化區(qū)時(shí),作廢本層符號(hào)表,標(biāo)識(shí)符處理的原則,符號(hào)表的實(shí)現(xiàn),用局部符號(hào)表實(shí)現(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,,,,,,,,,,,,,符號(hào)表的實(shí)現(xiàn),用全局符號(hào)表實(shí)現(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,,,,,,,,,,標(biāo)號(hào)的語義分析,標(biāo)號(hào)出現(xiàn)的位置: 標(biāo)號(hào)聲明:label 1, 2, ,
12、 n; 標(biāo)號(hào)定位(語句前):i:Statement; 標(biāo)號(hào)使用(Goto后):goto i; 標(biāo)號(hào)部分的語義錯(cuò)誤: 標(biāo)號(hào)重復(fù)聲明; 標(biāo)號(hào)重復(fù)定位; 標(biāo)號(hào)有定位而無聲明; 標(biāo)號(hào)有使用而無定位; Goto語句有非法轉(zhuǎn)入.,標(biāo)號(hào)部分語義分析原理,設(shè)置五種表:LDEC,LDEF,LUSE,SL,PL LDEC表:(Flag, Label,); LDEF、LUSE表:(Label); SL表:(kind,LDEFaddr,LUSEaddr); PL表:(LDECaddr,LDEFaddr); 標(biāo)號(hào)的語義分析原理 1)進(jìn)入一個(gè)過/函時(shí),將本層LDEC和LDEF的地址填入PL表; 2)遇到
13、一個(gè)標(biāo)號(hào)聲明“l(fā)abel 1, 2,,n”時(shí),建立本層LDEC表(檢查重復(fù)聲明錯(cuò)誤),其中的Flag標(biāo)志均設(shè)置為0; 3)遇到定位性標(biāo)號(hào)“:Statement”時(shí): 檢查在LDEC表中有無 ,若無則表示無標(biāo)號(hào)聲明錯(cuò)誤; 若有,則檢查其Flag位,若是1,則有重復(fù)定位錯(cuò)誤; 若Flag=0,令其Flag位為1,并將 填入LDEF表中。 查看LUSE表,若其中有則將其刪除掉。,4)進(jìn)入一個(gè)結(jié)構(gòu)語句時(shí),將本語句的LDEF和LUSE表位置填入SL表; 5)遇到一個(gè)“goto ” 時(shí): 查看LDEF表,看其中是否有; 若無,將填入LUSE表; 6)退出一個(gè)結(jié)構(gòu)化語句時(shí): 清查本層LUSE表(若有定位則刪除該項(xiàng)):用本層的LUSE中標(biāo)號(hào)查本層定位表,若查到,則把該項(xiàng)從LUSE中刪除; 作廢本層的LDEF。 7)退出一個(gè)過/函時(shí): 清查本層LUSE表; 作廢本層的LDEC和LDEF。 8)程序結(jié)束時(shí),清查LUSE表,若非空,則說明有標(biāo)號(hào)為定位的錯(cuò)誤。,