編譯原理及實現(xiàn)技術課件:第六章 語義分析_第1頁
編譯原理及實現(xiàn)技術課件:第六章 語義分析_第2頁
編譯原理及實現(xiàn)技術課件:第六章 語義分析_第3頁
編譯原理及實現(xiàn)技術課件:第六章 語義分析_第4頁
編譯原理及實現(xiàn)技術課件:第六章 語義分析_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第六章 語義分析語義分析概述符號表1 語義分析必要性分類語義錯誤功能1.1語義分析的必要性語法和語義的區(qū)別 語法:關于什么樣的字符串才是該語言在組成結構上合法的程序的法則。語義:關于結構上合法的程序的意義法則。1.2語義分析的分類語義種類指稱語義操作語義公理語義靜態(tài)語義:在編譯階段(從程序文本上)可以檢查的語義。動態(tài)語義:通過程序的執(zhí)行才能檢查的語義。1.3語義錯誤各種條件表達式的類型是不是boolean型?運算符的分量的類型是否相容?賦值語句的左右部的類型是否相容?形參和實參的類型是否相容?下標表達式的類型是否為所允許的類型?函數(shù)說明中的函數(shù)類型和返回值的類型是否一致?VE中的V是不是變量,

2、而且是數(shù)組類型?V.id中的V是不是變量,而且是記錄類型? id是不是該記錄類型中的域名?y+f()中的f是不是函數(shù)名?形參個數(shù)和實參個數(shù)是否一致?p()語句中的p是不是過程名?形參個數(shù)和實參個數(shù)是否一致?V中的V是不是指針或文件變量?變體記錄中表示情形的常量是否為合法類型?子界類型中的下界和上界類型是否相容?下界是否小于等于上界?語義錯誤 cont.每個使用性標識符是否都有聲明?在同層內有無標識符被聲明多次?標號是否有聲明?有無重復聲明和重復定位錯誤?有無非法轉入錯誤?1.4語義分析的功能語義分析的內容:類型分析;標識符相關信息提取;語義分析的功能:檢查語義錯誤構造標識符屬性表(符號表)語義

3、分析的實現(xiàn):與語法分析相結合語義分析的功能圖示語義分析語法分析樹TokenList語義定義自然語言描述規(guī)定符號表判定語義錯誤2 符號表符號名屬性xint, variable, pvoid, function, (int i), .詞法分析語法分析語義分析中間代碼生成2.1地位符號名類型指針大小xfunM2.2符號的內部表示值的內部表示類型的內部表示標識符的內部表示2.2.1值的內部表示基本類型:整型,實型無序類型:指針,數(shù)組,結構體有序類型:布爾,字符,枚舉,數(shù)組下標布爾常量:ord(false)=0, ord(true)= 1字符常量:ord(C) = ASC(C)枚舉常量:設有枚舉類型(D

4、,A,B),則有ord(D)=0,ord(A)=1,ord(B)=22.2.2類型的內部表示類型的種類:標準、子界、枚舉、數(shù)組、記錄、集合、文件、指針類型等Type=(intTy,boolTy,charTy,realTy, subTy,enumTy, arrayTy,recordTy,setTy,fileTy,pointerTy)內部表示:(TypeIR)int/bool/char/real:enum: array:pointer: SizeTypeSizeTypeElementListLengthSizeTypeLowUpElementTypeSizeTypeTypeName2intTy6e

5、numTyintPtr310arryTy04intPtrsize(pointer)pointerTyintPtr實例int f(real x, char y)bool t=true;enum a a1,a2,a3;real bM;char c*;return t;寫出各類型的內部表示。類和結構體結構體類SizeKindFieldListnameKindTypeOff實例class StudentString name;int age;real mark;public Student(String n,int a, real m)=n;this.age=a;this.mark

6、= m;getsetSizeKindFieldListnameKindTypeOffnamefieldKindcharPtr0agefieldKindintPtr1markfieldKindrealPtr3StudentfieldKindPtr7get2.2.3標識符的內部表示常見標識符種類:常量名、類型名、變量名、函數(shù)名、過程名、域名。Kind=(consKind, typeKind, varKind,fieldKind, funcKind,procKind)內部表示(AttributeIR):常量名:變量名:類型名:過函名:域名名:NameKindTypeValueNameKindType

7、AccesLevelOffValueNameKindTypeNameKindTypeClassLevelOffParaCodeSizeForNameTypeOffNextMconstKindintPtr10avarKindrealPtrdirect13Null/100mattypeKindPtrffuncKindintPtrformal15ffuncKindintPtractual1parListptrFt/fmarkvarKind3pNext層數(shù)和偏移層數(shù)(level)過程/函數(shù)的定義(不)可以嵌套;最外層程序的層數(shù)為1(0);偏移量(offset)原因:執(zhí)行過程/函數(shù)的調用時, 需要為其中

8、的變量分配空間;計算:偏移量指的是變量針對其所在過程/函數(shù)的空間的首地址的偏移量;實例#define Pi 3.14bool g(real x, int * y)int v10;real z;return 0;enum gender male,female;Main()令當前層數(shù)和偏移分別為L和0,構造標識符Pi,g,x,y,v,z,gender的屬性表。NameKindTypeValueClassAccessLevelOff/ParaCodeSizeForPiconsreal3.14gfuncboolactuaLparaListPnullsizeFalsexvarKrealdirectL+1

9、04yvarKp1indirecL+141vvarKa1directL+1520zvarKrealdirectL+1314gendvarKe1L0PtrSizeKindTypUpEleTypeintPtr2boolP1charP1realPt4p11poinintPta120arra9intPte11enuNameValuemale1female22.3符號表標識符在不同位置的不同作用:聲明部分:定義了各種對象及對應的屬性和使用規(guī)則。程序體:對所定義的對象進行各種操作。必要性Token序列:符號表(種類、類型等信息):$IDidnameidnameAttribute12.3.1建立和訪問有關符

10、號表的操作: 添加、作用域刪除、查詢處理符號表的模塊: 定義符號表數(shù)據(jù)結構 定義符號表上的操作2.3.2符號表的處理符號表的作用:為語義檢查和代碼生成提供標識符的語義信息。標識符的處理思想:遇到定義性標識符時,在符號表中填寫被定義標識符的符號項;遇到使用性標識符時,用該標識符查符號表求得其屬性。標識符的特點標識符的作用域:標識符有效的最大程序段嵌套作用域規(guī)則:當存在標識符的嵌套聲明時,最近定義的屬性為標識符的當前屬性局部化單位:允許有聲明的程序段P:Var x ,y,zVar x,m,nx:=1;m:=x+1;y:=x+1;x:=0;Q:局部化區(qū)入口Proc p(Func f(Record b

11、egin標識符處理的原則符號表的種類:全局符號表、局部符號表處理原則:進入一個局部化區(qū)時,記錄本層符號表的位置 遇到定義性標識符時,構造其語義信息,查本層符號表,若存在,則有重復聲明錯誤,否則將語義信息填入表中 遇到一個使用性標識符時,查表(從里層到外層),查不到則有未定義標識符錯誤,否則構造新的TOKEN退出一個局部化區(qū)時,作廢本層符號表語義分析例子int x,y;void swap(int *a,int *b)int tmp;temp=*a; *a=*b;*b=tmp;void main()x=10; y=20;swap(&x,&y);NameKindTypeAccessLevelOffP

12、araListCodeForwardxvarKindintPtrdir00yvarKindintPtrdir01swapfuncKindNullactural0swapParaListswapCfalseavarKinda-ptrindir10bvarKindb-ptrindir11tmpvarKindintPtrdir12#mainfuncKindNullactual0NullmainCFalse#ptrsizekindeleTypea-ptr1pointerTyintPtrb-ptr1pointerTyintPtr符號表的分類單表結構 vs. 多表結構單表:標識符都放在同一張符號表中多表:

13、常量、變量、類型、函數(shù)、等分別存放局部表 vs. 全局表局部式:每個局部化單位建立一個獨立符號表全局式:整個程序的符號表作為一個表刪除法 vs. 駐留法思想特點刪除法離開局部化區(qū)時刪除思路簡單,實現(xiàn)容易,信息不留存駐留法離開局部化區(qū)時標記信息留存,實現(xiàn)相對復雜(輔助數(shù)據(jù)結構)Scope棧用于存放當前有效的局部化區(qū)的局部符號表首地址;進入新局部化區(qū)時新符號表首地址入棧;退出局部化區(qū)時棧頂?shù)刂烦鰲?。局部化實例int main() int a; float b,d; int c; float a; int d; float c; float d; /. a=b+c+d; char d; return

14、 0;namekindtypeaccessleveloffextraformainfuncKintPtractural0nullfalseavarKiintPtrdir101bvarKirealPtdir111dvarKirealPtdir131cvarKiintPtrdir152avarKirealPtdir162dvarKiintPtrdir183cvarKirealPtdir193dvarKirealPtdir1114#dvarKicharPdir183標號的語義分析標號出現(xiàn)的位置:標號聲明:label 1, 2, , n;標號定位(語句前):i:Statement;標號使用(Goto后

15、):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)遇到一個標號聲明“l(fā)abel 1, 2,n”時,建立本層LDEC表(檢查重復聲明錯誤),其中的Flag標志均設置為0;3)遇到定位性標號“:Statement”時:檢查在LDEC表中有無 ,若無則表示無標號聲明錯誤;若有,則檢查其Flag位,若是1,則有重復定位錯誤;若Flag=0,令其Flag位為1,并將 填入LDEF表中。查看L

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論