編譯原理第六章_第1頁(yè)
編譯原理第六章_第2頁(yè)
編譯原理第六章_第3頁(yè)
編譯原理第六章_第4頁(yè)
編譯原理第六章_第5頁(yè)
已閱讀5頁(yè),還剩74頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第6章語(yǔ)義分析(SemanticAnalysis)

和符號(hào)表Semantic:oforrelatingtomeaning,especiallymeaninginlanguage.1語(yǔ)義分析在編譯程序中的邏輯位置表處理錯(cuò)誤處理目標(biāo)代碼生成中間代碼優(yōu)化中間代碼生成語(yǔ)義分析語(yǔ)法分析詞法分析目標(biāo)程序源程序26.1 語(yǔ)義分析概述6.2 符號(hào)表的數(shù)據(jù)結(jié)構(gòu)6.3 符號(hào)表的管理6.4 程序設(shè)計(jì)語(yǔ)言符號(hào)表的實(shí)例

3主要內(nèi)容:語(yǔ)義分析的功能及重要性;標(biāo)識(shí)符的內(nèi)部表示;類(lèi)型的內(nèi)部表示;符號(hào)表的組織。46.1語(yǔ)義分析概述6.1語(yǔ)義分析概述

語(yǔ)法和語(yǔ)義的區(qū)別語(yǔ)法:描述一個(gè)合法定義的程序結(jié)構(gòu)的規(guī)則。語(yǔ)義:說(shuō)明一個(gè)合法定義的程序的含義的規(guī)則。5PASCAL語(yǔ)言的條件語(yǔ)句:ifx>ythenz:=z+1elsez:=z-1C語(yǔ)言的條件語(yǔ)句:

if(x>y){z=z+1;}else{z=z-1;}6inti;switch(i){case0:printf(“%s\n”,“auto”);break;case1:printf(“%s\n”,“static”);break;case2:printf(“%s\n”,“extern”);break;case1:printf(“%s\n”,“register”);break;}7intx=10;Main(){printf(“%d”,x+x);x();

f=x;}floatf(){intx=20,y;floatx;printf(“%d”,x);}符合變量聲明的語(yǔ)法、語(yǔ)義符合函數(shù)聲明的語(yǔ)法、語(yǔ)義符合函數(shù)調(diào)用的語(yǔ)法、不符合語(yǔ)義符合賦值語(yǔ)句的語(yǔ)法、不符合語(yǔ)義符合變量聲明的語(yǔ)法、語(yǔ)義符合變量聲明的語(yǔ)法、不符合語(yǔ)義8語(yǔ)義分析的必要性一個(gè)語(yǔ)法正確的程序不能保證它是有意義的.程序中容易出現(xiàn)各種語(yǔ)義錯(cuò)誤:標(biāo)識(shí)符未聲明操作數(shù)的類(lèi)型與操作符的類(lèi)型不匹配……9程序設(shè)計(jì)語(yǔ)言語(yǔ)義的分類(lèi)靜態(tài)語(yǔ)義編譯時(shí)(compile-time)可以檢查的語(yǔ)義例如:標(biāo)識(shí)符未聲明動(dòng)態(tài)語(yǔ)義目標(biāo)程序運(yùn)行時(shí)(run-time)才能檢查的語(yǔ)義例如:除零溢出錯(cuò)誤10如何描述程序設(shè)計(jì)語(yǔ)言的語(yǔ)義?程序設(shè)計(jì)語(yǔ)言的形式語(yǔ)義屬性文法(用于描述靜態(tài)語(yǔ)義)操作語(yǔ)義(OperationalSemantics)指稱(chēng)語(yǔ)義(DenotationalSemantics)代數(shù)語(yǔ)義(AlgebraSemantics)公理語(yǔ)義(AxiomaticSemantics)形式語(yǔ)義描述技術(shù)沒(méi)有形式語(yǔ)法描述技術(shù)成熟碩士研究生的課程-《形式語(yǔ)義學(xué)》11語(yǔ)義分析的主要任務(wù)根據(jù)聲明部分建立符號(hào)表

符號(hào)表(symboltable):是一種供編譯器用于保存有關(guān)源程序的各種信息的數(shù)據(jù)結(jié)構(gòu)。符號(hào)表的每個(gè)條目中包含與一個(gè)標(biāo)識(shí)符相關(guān)的信息,這些信息全面地反映該名字的屬性及它們?cè)诰幾g過(guò)程中的特征。 符號(hào)表的作用:存儲(chǔ)標(biāo)識(shí)符的屬性;便于檢查語(yǔ)義錯(cuò)誤;代碼生成階段作為地址分配的依據(jù)。12語(yǔ)義分析的主要任務(wù)(續(xù)1)在整個(gè)程序范圍內(nèi)檢查常見(jiàn)語(yǔ)義錯(cuò)誤聲明和使用相關(guān)的錯(cuò)誤類(lèi)型相關(guān)的語(yǔ)義錯(cuò)誤

13常見(jiàn)的語(yǔ)義錯(cuò)誤聲明和使用相關(guān)的語(yǔ)義錯(cuò)誤常見(jiàn)的語(yǔ)義錯(cuò)誤:每個(gè)使用性標(biāo)識(shí)符是否都有聲明?在同層內(nèi)有無(wú)標(biāo)識(shí)符被聲明多次?標(biāo)號(hào)是否有聲明?有無(wú)重復(fù)聲明和重復(fù)定位錯(cuò)誤?有無(wú)非法轉(zhuǎn)入錯(cuò)誤?如何檢查?每當(dāng)遇到新聲明的標(biāo)識(shí)符,查符號(hào)表:如果當(dāng)前有效的所有標(biāo)識(shí)符中有相同名字的,則是重復(fù)聲明錯(cuò)誤;否則生成它的屬性信息,保存到符號(hào)表中;每當(dāng)遇到標(biāo)識(shí)符的使用,查符號(hào)表如果沒(méi)有找到,說(shuō)明該標(biāo)識(shí)符沒(méi)有聲明;如果找到,則可獲取該標(biāo)識(shí)符的屬性,進(jìn)行進(jìn)一步分析;14類(lèi)型相關(guān)的語(yǔ)義錯(cuò)誤各種條件表達(dá)式的類(lèi)型是不是boolean型?運(yùn)算符的分量的類(lèi)型是否相容?賦值語(yǔ)句的左右部的類(lèi)型是否相容?形參和實(shí)參的類(lèi)型是否相容?下標(biāo)表達(dá)式的類(lèi)型是否為所允許的類(lèi)型?常見(jiàn)的語(yǔ)義錯(cuò)誤(續(xù)1)15函數(shù)說(shuō)明中的函數(shù)類(lèi)型和返回值的類(lèi)型是否一致?V[E]中的V是不是變量,而且是不是數(shù)組類(lèi)型?V.id中的V是不是變量,而且是不是結(jié)構(gòu)體類(lèi)型?id是不是該記錄類(lèi)型中的成員?V↑(*V)中的V是不是指針或文件變量?y+f(....)中的f是不是函數(shù)名?形參個(gè)數(shù)和實(shí)參個(gè)數(shù)是否一致?p(....)語(yǔ)句中的p是不是過(guò)程名?形參個(gè)數(shù)和實(shí)參個(gè)數(shù)是否一致?子界類(lèi)型中的下界和上界類(lèi)型是否相容?下界是否小于等于上界?常見(jiàn)的語(yǔ)義錯(cuò)誤(續(xù)2)16語(yǔ)義分析的實(shí)現(xiàn)方式一:不作為獨(dú)立的一遍類(lèi)型語(yǔ)義錯(cuò)誤檢查:可以安排在中間代碼生成時(shí)進(jìn)行一般的語(yǔ)義檢查:與語(yǔ)法分析相結(jié)合17方式二

獨(dú)立一遍的語(yǔ)義分析的功能圖示語(yǔ)義分析語(yǔ)法分析樹(shù)TokenList語(yǔ)義定義自然語(yǔ)言描述的規(guī)定符號(hào)表判定18類(lèi)C語(yǔ)言的抽象語(yǔ)法樹(shù)程序Root節(jié)點(diǎn)Node1節(jié)點(diǎn)Node2……節(jié)點(diǎn)Noden節(jié)點(diǎn)Node常量聲明類(lèi)型聲明變量聲明函數(shù)聲明FunNode1語(yǔ)句語(yǔ)句1920標(biāo)識(shí)符的屬性

6.2符號(hào)表的數(shù)據(jù)結(jié)構(gòu)名字類(lèi)型存取方式存儲(chǔ)類(lèi)別作用域和可視性21名字

在程序語(yǔ)言中,標(biāo)識(shí)符可以作為變量的名字、函數(shù)的名字或過(guò)程的名字,是變量、函數(shù)或過(guò)程的唯一標(biāo)志,因此在符號(hào)表中標(biāo)識(shí)符的名字一般不允許重名。若程序中出現(xiàn)重名標(biāo)識(shí)符:

1.將根據(jù)語(yǔ)言的定義,按照該標(biāo)識(shí)符在程序中的作用域和可視性規(guī)則進(jìn)行相應(yīng)的處理。

2.在一些允許操作重載(OperatorOverload)的語(yǔ)言中,函數(shù)名、過(guò)程名是可以重名的,對(duì)于這類(lèi)標(biāo)識(shí)符要通過(guò)它們的參數(shù)個(gè)數(shù)和類(lèi)型、函數(shù)返回值類(lèi)型來(lái)區(qū)別,以達(dá)到它們?cè)诜?hào)表中的唯一性。

標(biāo)識(shí)符的屬性22標(biāo)識(shí)符的屬性

(續(xù)1)類(lèi)型除過(guò)程標(biāo)識(shí)符之外,其他標(biāo)識(shí)符都具有類(lèi)型屬性,函數(shù)的數(shù)據(jù)類(lèi)型指的是函數(shù)返回值的數(shù)據(jù)類(lèi)型?;绢?lèi)型有整型、實(shí)型、字符型以及布爾型等。在基本類(lèi)型的基礎(chǔ)上,還可以定義數(shù)組、結(jié)構(gòu)體、聯(lián)合、枚舉、子界、集合、指針等結(jié)構(gòu)類(lèi)型。標(biāo)識(shí)符的類(lèi)型是在程序中該標(biāo)識(shí)符的定義部分得到的。變量標(biāo)識(shí)符的類(lèi)型屬性決定了變量所占存儲(chǔ)空間的大小以及能夠施于變量上的操作等。23標(biāo)識(shí)符的屬性(續(xù)2)存取方式

因?yàn)樽兞繕?biāo)識(shí)符代表的是一個(gè)內(nèi)存單元或一段連續(xù)的內(nèi)存單元,根據(jù)這些內(nèi)存單元中存放信息的類(lèi)別又可以把變量分為間接存取變量和直接存取變量。如果變量標(biāo)識(shí)符p所代表的內(nèi)存單元中存放的是另一個(gè)變量q對(duì)應(yīng)的內(nèi)存地址,則稱(chēng)變量p為間接存取變量;如果變量標(biāo)識(shí)符p所代表的內(nèi)存單元中存放的是一個(gè)值,則稱(chēng)變量p為直接存取變量。24標(biāo)識(shí)符的屬性(續(xù)3)存儲(chǔ)類(lèi)別存儲(chǔ)類(lèi)別是指數(shù)據(jù)的存儲(chǔ)方式,存儲(chǔ)方式可分為兩大類(lèi):靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行前即為數(shù)據(jù)分配好存儲(chǔ)空間(在靜態(tài)區(qū)),在程序運(yùn)行期間,數(shù)據(jù)的存儲(chǔ)空間仍保持不變;動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)函數(shù)調(diào)用(函數(shù)被激活)和分程序語(yǔ)句的開(kāi)始執(zhí)行(分程序語(yǔ)句被激活)的需要進(jìn)行動(dòng)態(tài)存儲(chǔ)分配。標(biāo)識(shí)符的存儲(chǔ)類(lèi)別屬性是編譯過(guò)程語(yǔ)義處理、檢查和存儲(chǔ)分配的重要依據(jù)。編譯程序一般根據(jù)變量聲明時(shí)的存儲(chǔ)類(lèi)別關(guān)鍵字以及它們聲明出現(xiàn)的位置和次序來(lái)確定每一個(gè)變量應(yīng)分配的存儲(chǔ)區(qū)及在該區(qū)中的具體位置。程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)25作用域和可視性標(biāo)識(shí)符在程序中起作用的范圍,稱(chēng)為它的作用域。一般地,定義該標(biāo)識(shí)符的位置及存儲(chǔ)類(lèi)關(guān)鍵字決定了它的作用域。如:C語(yǔ)言中,

動(dòng)態(tài)存儲(chǔ):

自動(dòng)變量(本函數(shù)內(nèi)有效)

寄存器變量(本函數(shù)內(nèi)有效)

形式參數(shù)(本函數(shù)內(nèi)有效)

靜態(tài)存儲(chǔ):

靜態(tài)局部變量(函數(shù)內(nèi)有效)

靜態(tài)外部變量(本文件內(nèi)有效)

外部變量(其他文件可引用)26通常一個(gè)變量的作用域就是該變量可以出現(xiàn)的場(chǎng)合,也就是說(shuō)在某個(gè)變量作用域范圍內(nèi)該變量是可以引用的,這就是變量可視性的作用域規(guī)則。有兩種情況也將影響變量的可視性。271、函數(shù)的形式參數(shù)和函數(shù)外部定義的變量重名:函數(shù)的形式參數(shù)在函數(shù)內(nèi)可見(jiàn)。inta;//外部定義的整型變量a

intfunc(a,b)

{

floata;//函數(shù)內(nèi)部定義的局部變量a,屏閉了外部定義的變量b;

…a…//引用floata.

}程序區(qū)靜態(tài)存儲(chǔ)區(qū)inta;動(dòng)態(tài)存儲(chǔ)區(qū)floata;

intb;28為了在函數(shù)中也能看inta,C的新版本中增加了文法記號(hào)“::”,如:inta;//外部定義的整型變量a

intfunc(a,b)

{

floata;//函數(shù)內(nèi)部定義的局部變量a,屏閉了外部定義的變量b;

…a…//引用floata.

…::a…//引用inta.

}程序區(qū)靜態(tài)存儲(chǔ)區(qū)inta;動(dòng)態(tài)存儲(chǔ)區(qū)floata;

intb;292、分程序結(jié)構(gòu):C語(yǔ)言中分程序語(yǔ)句的語(yǔ)法是:

{聲明語(yǔ)句}分程序的一個(gè)特點(diǎn)是它的嵌套結(jié)構(gòu)。分程序結(jié)構(gòu)的聲明作用域由下面的最近嵌套規(guī)則給出:(1)分程序B中聲明的作用域包括B。 (2)如果名字x沒(méi)有在B中聲明,那么B中x的出現(xiàn)是在外圍分程序B的x聲明的作用域中,且滿足:(a)B有x的聲明;(b)B比其它任何含x聲明的分程序更接近被嵌套的B。30…

{inta;

//第一層頭,定義的局部整型變量a

{chara;

//第二層頭,定義的局部字符型變量a

//第三層頭

{floata;

//第四層頭,定義的局部實(shí)型變量a

...a...

}//第四層尾

…a…//引用第二層定義的局部字符型變量a

//第三層尾

//第二層尾

....

//第一層尾

程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū):

inta;chara;flaota;31

值的內(nèi)部表示

類(lèi)型的內(nèi)部表示

標(biāo)識(shí)符的內(nèi)部表示三種內(nèi)部表示32

值的內(nèi)部表示

非結(jié)構(gòu)類(lèi)型值的內(nèi)部表示:實(shí)型:指針:

有序類(lèi)型:整數(shù)形式

33有序類(lèi)型的常量表示:

整型常量:ord(N)=N

布爾常量:ord(false)=0,ord(true)=1

字符常量:ord(C)=ASCⅡ(C)

枚舉常量:設(shè)有枚舉類(lèi)型(D,A,B),則有

ord(D)=0,ord(A)=1,ord(B)=2

子界常量:設(shè)有子界類(lèi)型C1..C2,則值空間為[ord(C1)...ord(C2)]34typedeffloatAT[10][100];類(lèi)型表達(dá)式:如:AT=ARRAY[1..10]OFARRAY[1..100]OFREAL;RT= RECORDx:real;a:AT; CASEu:booleanOF false:(k:integer); true:(y:real;b:boolean) END類(lèi)型的內(nèi)部表示:表示類(lèi)型表達(dá)式所包含的各種信息的數(shù)據(jù)結(jié)構(gòu)。類(lèi)型的內(nèi)部表示structRT{floatx;ATa;intu;union{intk;struct{floaty;intb;}rt2:};};35類(lèi)型的種類(lèi)屬性:標(biāo)準(zhǔn)、子界、枚舉、數(shù)組、記錄、集合、文件、指針類(lèi)型等等。

TypeKind=(intTy,boolTy,charTy,realTy,

enumTy,subTy,arrayTy, structTy,setTy,fileTy,pointerTy)類(lèi)型size屬性:表示此種類(lèi)型數(shù)據(jù)應(yīng)該分配的內(nèi)存空間的小。其它屬性依類(lèi)型的不同而不同。

enumTypeKind{intTy,boolTy,charTy,realTy,enumTy,subTy,arrayTy,structTy,setTy,fileTy,pointerTy};36內(nèi)部表示與類(lèi)型表

標(biāo)準(zhǔn)類(lèi)型:

SizeKind1intTy1boolTy1charTy2realTyintPtrboolPtrcharPtrrealPtrSizeKindIntSizeintTyBoolSizeboolTyCharSizecharTyRealSizerealTyintPtrboolPtrcharPtrrealPtr37子界類(lèi)型:例:T=1..10;TypeIR’(Size:1,Kind:subTyHostType:intPtr,low:1,up:10)

SizeKindHostTypeLowUpSubSizeSubTySizeKindHostTypeLowUp1subTyIntPtr11038ElemTypeSizeKindArraySizeArrayTyLowUp其中各個(gè)域的含義如下:Size表示數(shù)組類(lèi)型所占空間的大小,是數(shù)組所有成分?jǐn)?shù)據(jù)占用空間的和,需要通過(guò)計(jì)算得到,Size=(Up-Low+1)*sizeof(ElemType),其中sizeof是一個(gè)輔助函數(shù),用于計(jì)算每種類(lèi)型的size;Kind=arrayTy,表示是數(shù)組類(lèi)型;Low表示數(shù)組下標(biāo)的下界,在C語(yǔ)言中Low=0;Up表示數(shù)組下標(biāo)的上界;ElemType

表示數(shù)組成分類(lèi)型的內(nèi)部表示指針。

數(shù)組類(lèi)型(方案1):39例:C語(yǔ)言的數(shù)組

typedefintA[10];

typedefcharB[5][10];ElemTypeIntPtrSizeKind

ArrayTyLowUp09A和B的內(nèi)部表示分別為:ElemTypeSizeKind

ArrayTyLowUp04ElemTypeCharPtrSizeKind10ArrayTyLowUp09105040例:Pascal語(yǔ)言的數(shù)組type A=array[1..10]ofinteger; B=array[1..5]ofarray[1..10]ofchar;

ElemTypeIntPtrSizeKind

ArrayTyLowUp110A和B的內(nèi)部表示分別為:ElemTypeSizeKind

ArrayTyLowUp15ElemTypeCharPtrSizeKind

ArrayTyLowUp11050101041數(shù)組類(lèi)型(方案2):ElemTypeSizeKindSubSizeArrayTyIndexTy其中各個(gè)域的含義如下:Size表示數(shù)組類(lèi)型所占空間的大小,是數(shù)組所有成分?jǐn)?shù)據(jù)占用空間的和,需要通過(guò)計(jì)算得到,Size=(Up-Low+1)*sizeof(ElemType),其中sizeof是一個(gè)輔助函數(shù),用于計(jì)算每種類(lèi)型的size;Kind=arrayTy,表示是數(shù)組類(lèi)型;IndexTy表示數(shù)組下標(biāo)類(lèi)型的內(nèi)部表示指針。ElemType

表示數(shù)組成分類(lèi)型的內(nèi)部表示指針。

42例:C語(yǔ)言的數(shù)組

typedefintA[10]; A的內(nèi)部表示為:ElemTypeSizeKind10ArrayTyIndexTySizeKindHostTypeLowUp1SubTyIntPtr09IntPtr43B的內(nèi)部表示為:ElemTypeSizeKind50ArrayTyIndexTySizeKindHostTypeLowUp1SubTyIntTy15ElemTypeCharPtrSizeKind10ArrayTyIndexTySizeKindHostTypeLowUp1SubTyIntTy110例:Pascal語(yǔ)言的數(shù)組type B=array[1..5]ofarray[1..10]ofchar;

44FieldListKindSize結(jié)構(gòu)體與共用體類(lèi)型其中各個(gè)域的含義如下:Size表示該類(lèi)型數(shù)據(jù)所占空間的大小,結(jié)構(gòu)體是所有域占用空間的和,共用體類(lèi)型則是所有域中占用空間的最大者的值。Kind=structTy,表示是結(jié)構(gòu)體或共用體類(lèi)型;FieldList是域名表的表頭指針。45其中各個(gè)域的含義如下:Name表示標(biāo)識(shí)符的名字;Type=TypePtr,TypePtr是域名標(biāo)識(shí)符類(lèi)型的內(nèi)部表示指針;Off表示域名標(biāo)識(shí)符相對(duì)于結(jié)構(gòu)體或共用體類(lèi)型分配的內(nèi)存塊起始地址的偏移量,對(duì)于聯(lián)合類(lèi)型而言,所有的域名標(biāo)識(shí)符的起始偏移都是相同的,所以可以省略;OffTypeName域名標(biāo)識(shí)符的內(nèi)部表示如下:

結(jié)構(gòu)體與共用體類(lèi)型--域名表46xV1V2VnoffVn=offVn-1+sizeof(typeof(Vn-1))………offVnoffV2=2offV1=0x+247

例:c語(yǔ)言的結(jié)構(gòu)體typedefstruct{intyear,month,day;}

datetype;structTy30intPtryear1intPtrmonth2intPtrday48

例:c語(yǔ)言的共用體typedefunion{charch;inti;

floatf;}datatype;structTy20charPtrch0intPtri0realPtrf49例:Pascal語(yǔ)言的記錄類(lèi)型RECORD j:integer; r:RECORDj:integer;b:booleanENDENDstructTy30intPtrj1boolPtrbstructTy20intPtrj1

r50FieldListKindSize枚舉類(lèi)型其中各個(gè)域的含義如下:size表示枚舉類(lèi)型所占空間的大??;Kind=enumTy表示是枚舉類(lèi)型;ElemList是指向枚舉常量表表頭的指針,其中枚舉常量表的內(nèi)部表示結(jié)構(gòu)如下:FieldListKindSize其中各個(gè)域的含義如下:size表示枚舉類(lèi)型所占空間的大??;Kind=enumTy表示是枚舉類(lèi)型;ElemList是指向枚舉常量表表頭的指針,其中枚舉常量表的內(nèi)部表示結(jié)構(gòu)如下:ValueNameName表示枚舉常量的名字Value表示枚舉常量所代表的整數(shù)值。51例:c語(yǔ)言的枚舉類(lèi)型

enumcolor{red,yellow,blue}

enumTy10red1yellow2blue例:c語(yǔ)言的枚舉類(lèi)型

enumcolor{red=10,yellow=red+2,blue}

enumTy110red12yellow13blue52指針類(lèi)型c語(yǔ)言中指針類(lèi)型其定義形式為:T*T稱(chēng)為此指針類(lèi)型的基類(lèi)型。由指針類(lèi)型可以定義指針變量,指針變量的定義形式為:T*p;pascal語(yǔ)言中指針類(lèi)型其定義形式為:↑

p:T;53指針類(lèi)型的內(nèi)部表示:TypeKindSize其中各個(gè)域的含義如下:size表示指針類(lèi)型所占空間的大小;Kind=pointTy表示是指針類(lèi)型;Type是指向指針類(lèi)型的基類(lèi)型的內(nèi)部表示的指針。54intPtrpointTy1例:c語(yǔ)言的針舉類(lèi)型typedefint*T1;typedef

float*T2;realPtrpointTy155標(biāo)識(shí)符的內(nèi)部表示

標(biāo)識(shí)符種類(lèi):

常量名、類(lèi)型名、變量名、函數(shù)名、過(guò)程名、域名。

TYPEidkind=(consKind,typeKind,varKind,procKind,funcKind,fieldKind)

內(nèi)部表示(AttributeIR):

56常量標(biāo)識(shí)符的內(nèi)部表示其中各個(gè)域的含義如下:Name是常量的名字;Kind=constKind,表明該標(biāo)識(shí)符是常量標(biāo)識(shí)符;Type=TypePtr,其中TypePtr是指向具體常量的類(lèi)型的內(nèi)部表示的指針;Value=ValPtr,其中ValPtr是指向具體常量值的內(nèi)部表示的指針。ValueTypeKindName57常量標(biāo)識(shí)符pai和count的內(nèi)部表示為:↑3.14realPtrconstKindpai例: Pascal語(yǔ)言的常量定義:

const pai=3.14;

count=100;

C語(yǔ)言的常量定義:

#definepai3.14 #definecount100↑100intPtrconstKindcount58變量標(biāo)識(shí)符的內(nèi)部表示OffLevelAccessTypePtrKindValueName其中各個(gè)域的含義如下:Name是變量的名字;Kind=varKind,表明該標(biāo)識(shí)符是變量標(biāo)識(shí)符;Type=TypePtr,其中TypePtr是指向具體變量的類(lèi)型的內(nèi)部表示的指針;59變量標(biāo)識(shí)符的內(nèi)部表示(續(xù)1):OffLevelAccessTypePtrKindValueName其中各個(gè)域的含義如下:Access=dir表示變量是直接變量,Access=indir表示變量是間接變量;Value=ValPtr,如果變量定義時(shí)說(shuō)明了初值,則為初值的內(nèi)部表示的指針,否則為空。Level表示該變量聲明所在主程序/函數(shù)/過(guò)程的層數(shù);Off表示該變量相對(duì)它所在主程序/函數(shù)/過(guò)程的內(nèi)存塊起始地址的偏移量;60offLdirintPtrvarKindnullxOff+1LdirrealPtrvarKindnullyOff+3LindirrealPtrvarKindnullz例:Pascal語(yǔ)言的變量聲明:

varx:integer; y:real;z:real;

變量標(biāo)識(shí)符x、y和z的內(nèi)部表示為(當(dāng)前層為L(zhǎng),可用區(qū)距為off):61offLdirintPtrvarKind↑10xOff+1LdirrealPtrvarKindnullyOff+3LindirrealPtrvarKindnullz變量標(biāo)識(shí)符x、y和z的內(nèi)部表示為(當(dāng)前層為L(zhǎng),可用區(qū)距為off):例:C語(yǔ)言的變量聲明:

intx=10; floaty;

float*z;62類(lèi)型標(biāo)識(shí)符的內(nèi)部表示TypePtrKindName其中各個(gè)域的含義如下:Name是類(lèi)型標(biāo)識(shí)符的名字;Kind=typeKind,表示標(biāo)識(shí)符是類(lèi)型標(biāo)識(shí)符;Type=TypePtr,指向類(lèi)型標(biāo)識(shí)符指代的類(lèi)型的內(nèi)部表示。63例:Pascal語(yǔ)言的類(lèi)型定義:

type t1=integer; t2=array[1..10]ofinteger;intPtrtypeKindt1typeKindt2ElemTypeIntPtrSizeKind10ArrayTyLowUp110類(lèi)型標(biāo)識(shí)符t1和t2的內(nèi)部表示為:64例:C語(yǔ)言的類(lèi)型定義:

typedefintt1; typedefintt2[10];intPtrtypeKindt1typeKindt2ElemTypeIntPtrSizeKind10ArrayTyLowUp09類(lèi)型標(biāo)識(shí)符t1和t2的內(nèi)部表示為:65過(guò)程/函數(shù)標(biāo)識(shí)符的內(nèi)部表示子程序就是一段可能被重復(fù)使用多次的代碼或者是對(duì)程序某個(gè)功能的抽象。例如:在PASCAL中,子程序體現(xiàn)為過(guò)程或函數(shù),在C中,子程序體現(xiàn)為函數(shù)。C沒(méi)有過(guò)程的概念,其中返回值為void類(lèi)型的函數(shù)相當(dāng)于PASCAL中的過(guò)程。函數(shù)定義一般需包含兩部分的內(nèi)容,一部分是函數(shù)頭,定義函數(shù)的名字和形式參數(shù)的名字、類(lèi)型和個(gè)數(shù),以及函數(shù)返回值的類(lèi)型;另一部分是函數(shù)體,定義函數(shù)的語(yǔ)句序列,即函數(shù)的功能部分的具體體現(xiàn)。66過(guò)程/函數(shù)標(biāo)識(shí)符的內(nèi)部表示(續(xù)1)有函數(shù)體部分的過(guò)/函稱(chēng)為實(shí)在過(guò)/函,而出現(xiàn)在其他過(guò)/函定義的參數(shù)部分的過(guò)/函稱(chēng)為形式過(guò)/函,因?yàn)樗鼈冎皇瞧鹬f(shuō)明參數(shù)的性質(zhì)的作用,并沒(méi)有實(shí)際的函數(shù)體部分,只有形實(shí)參結(jié)合時(shí),才能獲得真正的函數(shù)體。C語(yǔ)言的函數(shù)定義:intf(intx,float*y,intinc(int*a))......"頭"{......f的函數(shù)體部分}67過(guò)程/函數(shù)標(biāo)識(shí)符的內(nèi)部表示(續(xù)2)其中各個(gè)域的含義如下:Name是過(guò)/函標(biāo)識(shí)符的名字;TypePtr表示函數(shù)返回值類(lèi)型的內(nèi)部表示(過(guò)程情形是NULL);Kind=routKind;

Class=actual表示實(shí)在過(guò)/函,Class=formal表示形式過(guò)/函;Level表示過(guò)/函的層數(shù);NameForwardSizeCodeClassParmLevelKindTypePtroff68其中各個(gè)域的含義如下:Off只對(duì)形式過(guò)/函有效,表示形式過(guò)/函在所屬過(guò)/函內(nèi)存塊中的偏移;Param表示過(guò)/函的參數(shù)表指針,參數(shù)表的結(jié)構(gòu)同符號(hào)表的結(jié)構(gòu)相同,參數(shù)信息可以填入符號(hào)表,也可以填入單獨(dú)的參數(shù)表當(dāng)中;Code只對(duì)實(shí)在過(guò)/函有效,表示過(guò)/函定義對(duì)應(yīng)生成的目標(biāo)代碼的起始地址,當(dāng)目標(biāo)代碼生成時(shí)回填得到,形式過(guò)/函的code為NULL;過(guò)程/函數(shù)標(biāo)識(shí)符的內(nèi)部表示(續(xù)3)NameForwardSizeCodeClassParamLevelKindTypePtroff69其中各個(gè)域的含義如下:Size只對(duì)實(shí)在過(guò)/函有效,表示過(guò)/函的目標(biāo)代碼所占內(nèi)存區(qū)的大小,也要當(dāng)目標(biāo)代碼生成以后回填得到;Forward屬性只對(duì)實(shí)在過(guò)/函有效,F(xiàn)orward=true表示過(guò)/函是超前聲明,Forward=false表示過(guò)/函不是超前聲明。過(guò)程/函數(shù)標(biāo)識(shí)符的內(nèi)部表示(續(xù)4)NameForwardSizeCodeClassParmLevelKindTypePtroff70c7172例:Pascal語(yǔ)言的函標(biāo)識(shí)符定義:

functionf(x:integer;vary:real;functioninc(vara:integer):integer):integer;"頭"begin......f的函數(shù)體部分

end;ffalseSizeCodeactualParmLroutKindintPtroff0L+1dirintPtrvarKindxoff0+1L+1indirrealPtrvarKindyincformalParmL+1routKindintPtr20L+2indirintPtrvarKindaTypePtrNameKindLeveloffParm

溫馨提示

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

評(píng)論

0/150

提交評(píng)論