版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第6章章 语义分析语义分析(Semantic Analysis) 和符号表和符号表Semantic:of or relating to meaning, especially meaning in language.2表表 处处 理理 错错 误误 处处 理理 目目标标代代码码生生成成中中间间代代码码优优化化中中间间代代码码生生成成语语义义分分析析语语法法分分析析词词法法分分析析目目标标程程序序源源程程序序36.1 语义分析概述语义分析概述6.2符号表的数据结构符号表的数据结构6.3符号表的管理符号表的管理6.4程序设计语言符号表的实例程序设计语言符号表的实例 语义分析的功能及重要性;语义分
2、析的功能及重要性;标识符的内部表示;标识符的内部表示;类型的内部表示;类型的内部表示;符号表的组织。符号表的组织。5语法:语法: 描述一个合法定义的程序结构的规则。描述一个合法定义的程序结构的规则。语义:语义: 说明一个合法定义的程序的含义的规则。说明一个合法定义的程序的含义的规则。6PASCALPASCAL语言的条件语句:语言的条件语句: if xy then z := z+1 else z := z -1 if xy then z := z+1 else z := z -1C C语言的条件语句:语言的条件语句:if (xy) z = z+1; else z=z-1; if (xy) z =
3、 z+1; else z=z-1; yxzyxzz117int iint i;switch switch (i i) case 0case 0:printfprintf(“%sn”%sn”,“auto”auto”) ;breakbreak;case 1case 1:printfprintf(“%sn”%sn”,“static”static”););breakbreak;case 2case 2:printfprintf(“%sn”%sn”,“extern”extern”););breakbreak;case 1case 1:printf(“%sn”printf(“%sn”,“register”
4、)register”);breakbreak; 8int x=10;int x=10;Main( )Main( ) printf( “%d”,x+x ); printf( “%d”,x+x ); x( ); x( ); f = x;f = x; float f( ) float f( ) int x=20,y;int x=20,y; float x; float x; printf( “%d”,x ); printf( “%d”,x ); 符合变量声明的语法、语义符合函数声明的语法、语义符合函数调用的语法、不符合语义符合赋值语句的语法、不符合语义符合变量声明的语法、语义符合变量声明的语法、不符
5、合语义9一个语法正确的程序不能保证它是有意义一个语法正确的程序不能保证它是有意义的的.程序中容易出现各种语义错误:程序中容易出现各种语义错误:标识符未声明标识符未声明操作数的类型与操作符的类型不匹配操作数的类型与操作符的类型不匹配10静态语义静态语义编译时编译时(compile-time)可以检查的语义可以检查的语义例如:标识符未声明例如:标识符未声明动态语义动态语义目标程序运行时(目标程序运行时(run-time)才能检查的)才能检查的语义语义例如:除零溢出错误例如:除零溢出错误11程序设计语言的形式语义程序设计语言的形式语义属性文法属性文法 (用于描述静态语义用于描述静态语义)操作语义操作
6、语义(Operational Semantics)指称语义指称语义(Denotational Semantics)代数语义代数语义(Algebra Semantics)公理语义公理语义(Axiomatic Semantics)形式语义描述技术没有形式语法描述技术成熟形式语义描述技术没有形式语法描述技术成熟硕士研究生的课程硕士研究生的课程-形式语义学形式语义学12u根据声明部分建立根据声明部分建立符号符号表表符号表(符号表(symbol table):):是一种供编译器用于保是一种供编译器用于保存有关源程序的各种信息的数据结构。符号表的每存有关源程序的各种信息的数据结构。符号表的每个条目中包含与
7、一个个条目中包含与一个标识符标识符相关的信息,这些信息相关的信息,这些信息全面地反映该名字的属性及它们在编译过程中的特全面地反映该名字的属性及它们在编译过程中的特征。征。 符号表的作用:符号表的作用:存储标识符的属性;存储标识符的属性;便便于于检查语义错误;检查语义错误;代码生成阶段作为代码生成阶段作为地址分配的依据地址分配的依据。13u在整个程序范围内检查在整个程序范围内检查常见常见语义错误语义错误声明和使用相关的错误声明和使用相关的错误类型相关的语义错误类型相关的语义错误 14声明和使用相关的语义错误声明和使用相关的语义错误Z常见的语义错误:常见的语义错误:每个使用性标识符是否都有声明每个
8、使用性标识符是否都有声明?在同层内有无标识符被声在同层内有无标识符被声明多次明多次? 标号是否有声明标号是否有声明?有无重复声明和重复定位错误有无重复声明和重复定位错误?有无非法有无非法转入错误?转入错误?Z如何检查如何检查?每当遇到新声明的标识符每当遇到新声明的标识符,查符号表:查符号表:如果当前有效的所有标识符中有相同名字的如果当前有效的所有标识符中有相同名字的,则是重复声则是重复声明错误明错误;否则生成它的属性信息否则生成它的属性信息,保存到符号表中保存到符号表中;每当遇到标识符的使用每当遇到标识符的使用,查符号表查符号表如果没有找到如果没有找到,说明该标识符没有声明说明该标识符没有声明
9、; 如果找到如果找到,则可获取则可获取该标识符的属性该标识符的属性,进行进一步分析进行进一步分析;类型相关的语义错误类型相关的语义错误各种条件表达式的类型是不是各种条件表达式的类型是不是boolean型型?运算符的分量的类型是否相容运算符的分量的类型是否相容?赋值语句的左右部的类型是否相容赋值语句的左右部的类型是否相容?形参和实参的类型是否相容形参和实参的类型是否相容?下标表达式的类型是否为所允许的类型下标表达式的类型是否为所允许的类型?16函数说明中的函数类型和返回值的类型是否一致函数说明中的函数类型和返回值的类型是否一致?VE中的中的V是不是变量是不是变量,而且是不是数组类型?而且是不是数
10、组类型?V.id中的中的V是不是变量是不是变量,而且是不是结构体类型而且是不是结构体类型? id是不是该是不是该记录类型中的成员记录类型中的成员?V(*V)中的中的V是不是指针或文件变量?是不是指针或文件变量?y+f(.)中的中的f是不是函数名是不是函数名?形参个数和实参个数是否一致形参个数和实参个数是否一致?p(.)语句中的语句中的p是不是过程名是不是过程名?形参个数和实参个数是否一形参个数和实参个数是否一致致?子界类型中的下界和上界类型是否相容子界类型中的下界和上界类型是否相容?下界是否小于等下界是否小于等于上界?于上界?17 语义分析的实现语义分析的实现类型语义错误检查:可以安排在中间代
11、类型语义错误检查:可以安排在中间代码生成时进行码生成时进行 一般的语义检查:与语法分析相结合一般的语义检查:与语法分析相结合18语义分析语义分析语法分析树语法分析树TokenListTokenList语义定义语义定义自然语言描述的规定自然语言描述的规定符号表符号表判定判定程序程序Root节点节点 Node1节点节点 Node2节点节点 Noden节点节点 Node常量声明常量声明类型声明类型声明变量声明变量声明函数声明函数声明FunNode1语句语句语句语句2021 名字名字类型类型存取方式存取方式存储类别存储类别作用域和可视性作用域和可视性22名字名字 在程序语言中,标识符可以作为变量的名字
12、、在程序语言中,标识符可以作为变量的名字、函数的名字或过程的名字,是变量、函数或过程的函数的名字或过程的名字,是变量、函数或过程的唯一标志,因此在符号表中标识符的名字一般不允唯一标志,因此在符号表中标识符的名字一般不允许重名。许重名。 若程序中出现重名标识符:若程序中出现重名标识符: 1. 1.将根据语言的定义,按照该标识符在程序将根据语言的定义,按照该标识符在程序中的作用域和可视性规则进行相应的处理。中的作用域和可视性规则进行相应的处理。 2. 2.在一些允许操作重载(在一些允许操作重载(Operator Overload)的语言中,函数名、过程名是可以重名的语言中,函数名、过程名是可以重名
13、的,对于这类标识符要通过它们的参数个数和类型、的,对于这类标识符要通过它们的参数个数和类型、函数返回值类型来区别,以达到它们在符号表中的函数返回值类型来区别,以达到它们在符号表中的唯一性。唯一性。 23 类型类型 除过程标识符之外,其他标识符都具有类型属除过程标识符之外,其他标识符都具有类型属性,函数的数据类型指的是函数返回值的数据类性,函数的数据类型指的是函数返回值的数据类型。型。基本类型有整型、实型、字符型以及布尔型等。基本类型有整型、实型、字符型以及布尔型等。在基本类型的基础上,还可以定义数组、结构在基本类型的基础上,还可以定义数组、结构体、联合、枚举、子界、集合、指针等结构类型。体、联
14、合、枚举、子界、集合、指针等结构类型。标识符的类型是在程序中该标识符的定义部分标识符的类型是在程序中该标识符的定义部分得到的。得到的。变量标识符的类型属性决定了变量所占存储空变量标识符的类型属性决定了变量所占存储空间的大小以及能够施于变量上的操作等。间的大小以及能够施于变量上的操作等。24存取方式存取方式 因为变量标识符代表的是一个内存单元或一段因为变量标识符代表的是一个内存单元或一段连续的内存单元,根据这些内存单元中存放信息的类别连续的内存单元,根据这些内存单元中存放信息的类别又可以把变量分为又可以把变量分为间接存取间接存取变量和变量和直接存直接存取变量。取变量。如果变量标识符如果变量标识符
15、p p所代表的内存单元中存放的是另一所代表的内存单元中存放的是另一个变量个变量q q对应的内存地址,则称变量对应的内存地址,则称变量p p为间接存取变量;为间接存取变量;如果变量标识符如果变量标识符p p所代表的内存单元中存放的是一个所代表的内存单元中存放的是一个值,则称变量值,则称变量p p为直接存取变量。为直接存取变量。 25存储类别存储类别存储类别是指数据的存储方式,存储方式可存储类别是指数据的存储方式,存储方式可分为两大类:分为两大类:静态静态存储方式存储方式和和动态动态存储方式存储方式。静态存储方式是指在程序运行前即为数据分配好存储空间静态存储方式是指在程序运行前即为数据分配好存储空
16、间( (在静态区在静态区) ),在程序运行期间,数据的存储空间仍保持不变;,在程序运行期间,数据的存储空间仍保持不变;动态存储方式则是在程序运行期间根据函数调用动态存储方式则是在程序运行期间根据函数调用( (函数被激函数被激活活) )和分程序语句的开始执行和分程序语句的开始执行( (分程序语句被激活分程序语句被激活) )的需要进行的需要进行动态存储分配动态存储分配。标识符的存储类别属性是编译过程语义处理、检查和存储分标识符的存储类别属性是编译过程语义处理、检查和存储分配的重要依据。编译程序一般根据变量声明时的存储类别关配的重要依据。编译程序一般根据变量声明时的存储类别关键字以及它们声明出现的位
17、置和次序来确定每一个变量应分键字以及它们声明出现的位置和次序来确定每一个变量应分配的存储区及在该区中的具体位置。配的存储区及在该区中的具体位置。26作用域和可视性作用域和可视性标识符在程序中起作用的范围,称为它的作用域。标识符在程序中起作用的范围,称为它的作用域。一般地,定义该标识符的位置及存储类关键字决一般地,定义该标识符的位置及存储类关键字决定了它的作用域。如:定了它的作用域。如:C C语言中,语言中, 动态存储:动态存储: 自动变量(本函数内有效)自动变量(本函数内有效) 寄存器变量(本函数内有效)寄存器变量(本函数内有效) 形式参数(本函数内有效)形式参数(本函数内有效) 静态存储:静
18、态存储: 静态局部变量(函数内有效)静态局部变量(函数内有效) 静态外部变量(本文件内有效)静态外部变量(本文件内有效) 外部变量(其他文件可引用)外部变量(其他文件可引用)27通常一个变量的作用域就是该变量可以出现的通常一个变量的作用域就是该变量可以出现的场合,也就是说在某个变量作用域范围内该变场合,也就是说在某个变量作用域范围内该变量是可以引用的,这就是变量可视性的作用域量是可以引用的,这就是变量可视性的作用域规则。规则。有两种情况也将影响变量的可视性。有两种情况也将影响变量的可视性。281、函数的形式参数和函数外部定义的变量重名:函、函数的形式参数和函数外部定义的变量重名:函数的形式参数
19、在函数内可见数的形式参数在函数内可见 。 int a int a; / / 外部定义的整型变量外部定义的整型变量a aint func(a ,b)int func(a ,b)float afloat a; / / 函数内部定义的局部变量函数内部定义的局部变量a, a, 屏闭了外部定义的变量屏闭了外部定义的变量a. int b; int b; a a / / 引用引用 float a . float a . 29为了在函数中也能看为了在函数中也能看 int a int a,C C的新版本中增加了文法记的新版本中增加了文法记号号“:”,如:,如: int a int a; / / 外部定义的整型变
20、量外部定义的整型变量a aint func(a ,b)int func(a ,b)float afloat a; / / 函数内部定义的局部变量函数内部定义的局部变量a, a, 屏闭了外部定义的变量屏闭了外部定义的变量a. int b; int b; a a / / 引用引用 float a . float a . :a:a / / 引用引用 int a . int a . 302、分程序结构分程序结构 :C C语言中分程序语句的语法是语言中分程序语句的语法是: : 声明声明 语句语句 分程序的一个特点是它的嵌套结构。分程序的一个特点是它的嵌套结构。分程序结构的声明作用域由下面的最近嵌套规则给
21、出:分程序结构的声明作用域由下面的最近嵌套规则给出: (1 1)分程序)分程序B B中声明的作用域包括中声明的作用域包括B B。 (2 2)如果名字)如果名字x x没有在没有在B B中声明,那么中声明,那么B B中中x x的出现的出现是在外围分程序是在外围分程序B B 的的x x声明的作用域中,且满足:声明的作用域中,且满足: (a a)B B 有有x x的声明;的声明; (b b)B B 比其它任何含比其它任何含x x声明的分程序更接近被声明的分程序更接近被嵌套的嵌套的B B。31 int a; / 第一层头第一层头,定义的局部整型变量定义的局部整型变量a char a; / 第二层头第二层
22、头,定义的局部字符型变量定义的局部字符型变量a / 第三层头第三层头 float a; / 第四层头第四层头,定义的局部实型变量定义的局部实型变量a . a . / 第四层尾第四层尾 a / 引用第二层定义的局部字符型变量引用第二层定义的局部字符型变量a / 第三层尾第三层尾 / 第二层尾第二层尾 . / 第一层尾第一层尾 int a;char a;flaot a; 值的内部表示值的内部表示 类型的内部表示类型的内部表示 标识符的内部表示标识符的内部表示三种内部表示三种内部表示 33Z 非结构类型值的内部表示:非结构类型值的内部表示: 实型:实型: 指针:指针: 有序类型:整数形式有序类型:整
23、数形式 34有序类型的常量表示:有序类型的常量表示: Z 整型常量:整型常量:ord(N) = Nord(N) = NZ 布尔常量:布尔常量:ord(false)=0, ord(true) = 1ord(false)=0, ord(true) = 1Z 字符常量:字符常量:ord(C) = ASC(C)ord(C) = ASC(C)Z 枚举常量:枚举常量:设有枚举类型设有枚举类型(D,A,B),(D,A,B),则有则有 ord(D)=0,ord(A)=1,ord(B)=2 ord(D)=0,ord(A)=1,ord(B)=2Z 子界常量:子界常量:设有子界类型设有子界类型C C1 1.C.C2
24、 2, ,则值空间则值空间 为为ord(Cord(C1 1).ord(C).ord(C2 2)35如:如:AT = ARRAY1.10 OF ARRAY1.100 OF REAL;RT = RECORD x : real; a : AT; CASE u : boolean OF false:( k : integer ); true :( y: real; b :boolean ) END36Z 类型的种类属性:类型的种类属性:标准标准、子界、枚举、数组、记录、子界、枚举、数组、记录、 集合、文件、指针类型等等。集合、文件、指针类型等等。 TypeKind = ( intTy,boolTy,c
25、harTy,realTy, enumTy,subTy,arrayTy, structTy,setTy,fileTy,pointerTy)Z 类型类型sizesize属性:属性:表示此种类型数据应该分配的内存空间的小。表示此种类型数据应该分配的内存空间的小。Z 其它属性依类型的不同而不同。其它属性依类型的不同而不同。 37Z内部表示内部表示与类型表与类型表 标准类型:标准类型: SizeKind1intTy1boolTy1charTy2realTyintPtrboolPtrcharPtrrealPtrSizeKindIntSizeintTyBoolSizeboolTyCharSizecharTy
26、RealSizerealTyintPtrboolPtrcharPtrrealPtr38子界类型:子界类型:例:例:T=1.10;TypeIR (Size:1, Kind:subTy HostType:intPtr, low:1, up:10) SizeKindHostTypeLowUpSubSize SubTySizeKindHostTypeLowUp 1 subTy IntPtr11039ElemTypeSizeKindArraySizeArrayTyLow Up其中各个域的含义如下:其中各个域的含义如下:ZSize表示数组类型所占空间的大小,是数组所有成分数表示数组类型所占空间的大小,是数
27、组所有成分数据占用空间的和,需要通过计算得到,据占用空间的和,需要通过计算得到,Size = (Up-Low+1)*sizeof(ElemType), 其中其中sizeof是一个辅助函数是一个辅助函数,用于计算每种类型的,用于计算每种类型的size;ZKind = arrayTy, 表示是数组类型;表示是数组类型;ZLow表示数组下标的下界,在表示数组下标的下界,在C语言中语言中Low = 0;ZUp表示数组下标的上界;表示数组下标的上界;ZElemType 表示数组成分类型的内部表示指针。表示数组成分类型的内部表示指针。 数组类型数组类型( (方案方案1 1):):40例:C语言的数组 ty
28、pedef int A10; typedef char B 5 10; ElemTypeIntPtrSizeKind ArrayTyLow Up09A A和和B B的内部表示分别为:的内部表示分别为:ElemTypeSizeKind ArrayTyLow Up04ElemTypeCharPtrSizeKind 10 ArrayTyLow Up09105041例:Pascal语言的数组 type A = array 1.10 of integer; B = array 1.5 of array 1.10 of char; ElemTypeIntPtrSizeKind ArrayTyLow Up1
29、10A A和和B B的内部表示分别为:的内部表示分别为:ElemTypeSizeKind ArrayTyLow Up15ElemTypeCharPtrSizeKind ArrayTyLow Up11050101042数组类型数组类型( (方案方案2 2):):ElemTypeSizeKindSubSizeArrayTyIndexTy其中各个域的含义如下:其中各个域的含义如下:ZSize表示数组类型所占空间的大小,是数组所有成分数表示数组类型所占空间的大小,是数组所有成分数据占用空间的和,需要通过计算得到,据占用空间的和,需要通过计算得到,Size = (Up-Low+1)*sizeof(Ele
30、mType), 其中其中sizeof是一个辅助函数是一个辅助函数,用于计算每种类型的,用于计算每种类型的size;ZKind = arrayTy, 表示是数组类型;表示是数组类型;ZIndexTy表示数组下标类型的内部表示指针。表示数组下标类型的内部表示指针。ZElemType 表示数组成分类型的内部表示指针。表示数组成分类型的内部表示指针。 43例:C语言的数组 typedef int A10;A A的内部表示为:的内部表示为:ElemTypeSizeKind 10 ArrayTyIndexTySizeKindHostTypeLowUp 1 SubTyIntPtr09IntPtr44B B的
31、内部表示为:的内部表示为:ElemTypeSizeKind 50 ArrayTyIndexTySizeKindHostTypeLowUp 1 SubTyIntTy15ElemTypeCharPtrSizeKind 10 ArrayTyIndexTySizeKindHostTypeLowUp 1 SubTyIntTy110例:Pascal语言的数组 type B = array 1.5 of array 1.10 of char; 45FieldListKindSize结构体与共用体类型结构体与共用体类型其中各个域的含义如下:其中各个域的含义如下:Size表示该类型数据所占空间的大小,结构体是所
32、有域表示该类型数据所占空间的大小,结构体是所有域占用空间的和,共用体类型则是所有域中占用空间的最大占用空间的和,共用体类型则是所有域中占用空间的最大者的值。者的值。Kind = structTy, 表示是结构体或共用体类型;表示是结构体或共用体类型;FieldList 是域名表的表头指针。是域名表的表头指针。46其中各个域的含义如下:其中各个域的含义如下:Name表示标识符的名字;表示标识符的名字;Type = TypePtr,TypePtr是域名标识符类型的内部表是域名标识符类型的内部表示指针;示指针;Off表示域名标识符相对于结构体或共用体类型分配的表示域名标识符相对于结构体或共用体类型分
33、配的内存块起始地址的偏移量,对于联合类型而言,所有的内存块起始地址的偏移量,对于联合类型而言,所有的域名标识符的起始偏移都是相同的,所以可以省略;域名标识符的起始偏移都是相同的,所以可以省略;OffTypeName域名标识符的内部表示如下:域名标识符的内部表示如下: 结构体与共用体类型结构体与共用体类型-域名表域名表47xV1V2VnoffVn= offVn-1+sizeof(typeof(Vn-1)offVnoffV2=2offV1=0 x+248 例:c语言的结构体typedef struct int year, month, day; datetype;structTy30 intPtr
34、year1 intPtrmonth2 intPtrday49 例:c语言的共用体typedef union char ch; int i; float f; datatype;structTy20 charPtrch0 intPtri0 realPtrf50例:Pascal语言的记录类型RECORD j : integer; r : RECORD j : integer; b : boolean ENDEND structTy30 intPtrj1 boolPtrbstructTy20 intPtrj1 r51FieldListKindSize枚举类型枚举类型其中各个域的含义如下:其中各个域的
35、含义如下:size表示枚举类型所占空间的大小;表示枚举类型所占空间的大小;Kind = enumTy表示是枚举类型;表示是枚举类型;ElemList是指向枚举常量表表头的指针是指向枚举常量表表头的指针,其中枚举常量表其中枚举常量表的内部表示结构如下:的内部表示结构如下:FieldListKindSize其中各个域的含义如下:其中各个域的含义如下:size表示枚举类型所占空间的大小;表示枚举类型所占空间的大小;Kind = enumTy表示是枚举类型;表示是枚举类型;ElemList是指向枚举常量表表头的指针是指向枚举常量表表头的指针,其中枚举常量表其中枚举常量表的内部表示结构如下:的内部表示结
36、构如下:ValueNameName表示枚举常量的名字表示枚举常量的名字Value表示枚举常量所代表的整数值。表示枚举常量所代表的整数值。52例:c语言的枚举类型 enum color red, yellow, blue enumTy10red1yellow2blue例:c语言的枚举类型 enum color red=10, yellow=red+2, blue enumTy110red12yellow13blue53指针类型指针类型c语言中指针类型其定义形式为:语言中指针类型其定义形式为:T *T称为此指针类型的基类型。称为此指针类型的基类型。由指针类型可以定义指针变量,指针变量的定义形由指针
37、类型可以定义指针变量,指针变量的定义形式为:式为: T* p;pascal语言中指针类型其定义形式为:语言中指针类型其定义形式为: p: T;54指针类型的内部表示:指针类型的内部表示:TypeKindSize其中各个域的含义如下:其中各个域的含义如下:size表示指针类型所占空间的大小;表示指针类型所占空间的大小;Kind = pointTy表示是指针类型;表示是指针类型;Type是指向指针类型的基类型的内部表示的指针。是指向指针类型的基类型的内部表示的指针。55intPtrpointTy1例:c语言的针举类型typedef int* T1;typedef float* T2;realPtr
38、pointTy156Z 标识符种类:标识符种类: 常量名、类型名、变量名、函数名、过程名、域名。常量名、类型名、变量名、函数名、过程名、域名。 TYPE idkind=( consKind, typeKind, varKind, procKind,funcKind ,fieldKind )Z 内部表示(内部表示(AttributeIR):): 常量标识符的内部表示常量标识符的内部表示其中各个域的含义如下:其中各个域的含义如下:Name是常量的名字;是常量的名字;Kind = constKind,表明该标识符是常量标识符;,表明该标识符是常量标识符;Type = TypePtr, 其中其中Typ
39、ePtr是指向具体常量的类是指向具体常量的类型的内部表示的指针;型的内部表示的指针;Value = ValPtr,其中,其中ValPtr是指向具体常量值的内是指向具体常量值的内部表示的指针。部表示的指针。ValueValueTypeTypeKindKindNameName58常量标识符常量标识符pai 和和count的内部表示为:的内部表示为:3.143.14realPtrrealPtrconstKindconstKindpaipai例:例:Pascal语言的常量定义:语言的常量定义:const pai = 3.14; count = 100; C语言的常量定义:语言的常量定义: #defin
40、e pai 3.14#define count 100 100100intPtrintPtrconstKindconstKindcountcount59变量标识符的内部表示变量标识符的内部表示OffOffLevelLevelAccessAccessTypePtrTypePtrKindKindValueValueNameName其中各个域的含义如下:其中各个域的含义如下:Name是变量的名字;是变量的名字;Kind = varKind,表明该标识符是变量标识符;,表明该标识符是变量标识符;Type = TypePtr, 其中其中TypePtr是指向具体变量的是指向具体变量的类型的内部表示的指针;
41、类型的内部表示的指针;60变量标识符的内部表示(续变量标识符的内部表示(续1):):OffOffLevelLevelAccessAccessTypePtrTypePtrKindKindValueValueNameName其中各个域的含义如下:其中各个域的含义如下:Access = dir表示变量是直接变量,表示变量是直接变量,Access = indir表示变量是间接变量;表示变量是间接变量;Value = ValPtr, 如果变量定义时说明了初值,则如果变量定义时说明了初值,则为初值的内部表示的指针,否则为空。为初值的内部表示的指针,否则为空。Level表示该变量声明所在主程序表示该变量声明
42、所在主程序/函数函数/过程的层过程的层数;数;Off表示该变量相对它所在主程序表示该变量相对它所在主程序/函数函数/过程的内过程的内存块起始地址的偏移量;存块起始地址的偏移量;61offoffL LdirdirintPtrintPtrvarKindvarKindnullnullx xOff+1Off+1L LdirdirrealrealPtrvarKindvarKindnullnully yOff+3Off+3L LindirindirrealrealPtrvarKindvarKindnullnullz z例:例:Pascal语言的变量声明:语言的变量声明: var x: integer; y
43、: real; z : real; 变量标识符变量标识符x x、y y和和z z的内部表示为(当前层为的内部表示为(当前层为L L,可用,可用区距为区距为off )off ):62offoffL LdirdirintPtrintPtrvarKindvarKind1010 x xOff+1Off+1L LdirdirrealrealPtrvarKindvarKindnullnully yOff+3Off+3L LindirindirrealrealPtrvarKindvarKindnullnullz z变量标识符变量标识符x、y和和z的内部表示为(当前层为的内部表示为(当前层为L,可用区距为可用
44、区距为off ):):例:例: C语言的变量声明:语言的变量声明: int x=10; float y; float* z; 63类型标识符的内部表示类型标识符的内部表示TypePtrTypePtrKindKindNameName其中各个域的含义如下:其中各个域的含义如下:Name是类型标识符的名字;是类型标识符的名字;Kind = typeKind, 表示标识符是类型标识符;表示标识符是类型标识符;Type = TypePtr, 指向类型标识符指代的类型指向类型标识符指代的类型的内部表示。的内部表示。64例:例:Pascal语言的类型定义:语言的类型定义: type t1 = integer
45、; t2 = array 1.10 of integer;intPtrtypeKindt1typeKindt2ElemTypeIntPtrSizeKind 10 ArrayTyLow Up110类型标识符类型标识符t1和和t2的内部表示为:的内部表示为:65例:例:C语言的类型定义:语言的类型定义: typedef int t1; typedef int t2 10;intPtrtypeKindt1typeKindt2ElemTypeIntPtrSizeKind 10 ArrayTyLow Up09类型标识符类型标识符t1和和t2的内部表示为:的内部表示为:66过程过程/函数标识符的内部表示函
46、数标识符的内部表示子程序就是一段可能被重复使用多次的代码或者是子程序就是一段可能被重复使用多次的代码或者是对程序某个功能的抽象。对程序某个功能的抽象。例如:在例如:在PASCAL中,子程序体现为过程或函数,中,子程序体现为过程或函数,在在C中,子程序体现为函数。中,子程序体现为函数。C没有过程的概念,其没有过程的概念,其中返回值为中返回值为void类型的函数相当于类型的函数相当于PASCAL中的过中的过程。程。函数定义一般需包含两部分的内容,一部分是函数函数定义一般需包含两部分的内容,一部分是函数头,定义函数的头,定义函数的名字和名字和形式参数的名字、类型和个形式参数的名字、类型和个数,以及函
47、数返回值的类型;另一部分是函数体,数,以及函数返回值的类型;另一部分是函数体,定义函数的语句序列,即函数的功能部分的具体体定义函数的语句序列,即函数的功能部分的具体体现。现。67过程过程/函数标识符的内部表示函数标识符的内部表示(续续1)有函数体部分的过有函数体部分的过/函称为实在过函称为实在过/函,而出现在其他函,而出现在其他过过/函定义的参数部分的过函定义的参数部分的过/函称为形式过函称为形式过/函,因为它函,因为它们只是起着说明参数的性质的作用,并没有实际的函们只是起着说明参数的性质的作用,并没有实际的函数体部分,只有形实参结合时,才能获得真正的函数数体部分,只有形实参结合时,才能获得真
48、正的函数体。体。C语言的函数定义: int f ( int x, float* y, int inc( int* a ) ) .头 . f的函数体部分 68过程过程/函数标识符的内部表示函数标识符的内部表示(续续2)其中各个域的含义如下:其中各个域的含义如下:Name是过是过/函标识符的名字;函标识符的名字;TypePtr表示函数返回值类型的内部表示表示函数返回值类型的内部表示(过程情形是过程情形是NULL);Kind = routKind; Class= actual表示实在过表示实在过/函,函,Class = formal表示形式过表示形式过/函;函;Level表示过表示过/函的层数;函的
49、层数;NameNameForwardForwardSizeSizeCodeCodeClassClassParmParmLevelLevelKindKindTypePtrTypePtroffoff69其中各个域的含义如下:其中各个域的含义如下:Off只对形式过只对形式过/函有效,表示形式过函有效,表示形式过/函在所属过函在所属过/函内存块中函内存块中的偏移;的偏移;Param表示过表示过/函的参数表指针,参数表的结构同符号表的结函的参数表指针,参数表的结构同符号表的结构相同,参数信息可以填入符号表,也可以填入单独的参数表当构相同,参数信息可以填入符号表,也可以填入单独的参数表当中;中;Code只
50、对实在过只对实在过/函有效,表示过函有效,表示过/函定义对应生成的目标代函定义对应生成的目标代码的起始地址,当目标代码生成时回填得到,形式过码的起始地址,当目标代码生成时回填得到,形式过/函的函的code为为NULL;过程过程/函数标识符的内部表示函数标识符的内部表示(续续3)NameNameForwardForwardSizeSizeCodeCodeClassClassParamParamLevelLevelKindKindTypePtrTypePtroffoff70其中各个域的含义如下:其中各个域的含义如下:Size只对实在过只对实在过/函有效,表示过函有效,表示过/函的目标代码所占内存区
51、的函的目标代码所占内存区的大小,也要当目标代码生成以后回填得到;大小,也要当目标代码生成以后回填得到;Forward 属性只对实在过属性只对实在过/函有效,函有效,Forward= true表示过表示过/函函是超前声明是超前声明, Forward = false表示过表示过/函不是超前声明。函不是超前声明。过程过程/函数标识符的内部表示函数标识符的内部表示(续续4)NameNameForwardForwardSizeSizeCodeCodeClassClassParmParmLevelLevelKindKindTypePtrTypePtroffoff71c7273例:Pascal语言的函标识符
52、定义: function f(x:integer;var y:real; function inc(var a:integer):integer):integer;头 begin .f的函数体部分 end;f ffalsefalseSizeSizeCodeCodeactualactualParmParmL LroutKindroutKindintPtrintPtroffoff0 0L+1L+1dirdirintPtrintPtrvarKindvarKindx xoffoff0 0+ +1 1L+1L+1indirindirrealPtrrealPtrvarKindvarKindy yincincformalformalParmParmL+1L+1routKindroutKindintPtrintPtr2 20 0L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高职财务会计(财务报表编制)试题及答案
- 2025年大学舞蹈编导(舞蹈编导)试题及答案
- 2025年大学机械工程(机械原理)试题及答案
- 2025年大学(理学)生态学试题及答案
- 2025年高职口腔医学技术(口腔修复工艺)试题及答案
- 2025年高职道路桥梁工程技术(桥梁工程施工)试题及答案
- 2025年高职项目管理(项目计划制定)试题及答案
- 2025年中职国际经济与贸易(国际经济与贸易教学法)试题及答案
- 2025年高职工业机器人技术(机器人保养)试题及答案
- 2025年大学大三(中医学)中医内科学基础试题及答案
- 企业数据安全管理制度
- 2025年公务员多省联考《申论》题(陕西A卷)及参考答案
- 摘菜劳动课件
- 2025义齿行业市场分析报告
- DB34∕T 4796-2024 药品临床综合评价质量控制规范
- 2025年公共管理与公共政策专业考试试卷及答案
- 2025年秋北京版(2024)小学英语五年级上册(期中)综合词汇句子专项训练题及答案
- 蔚来智驾安全培训课件
- 液压设备结构设计与安全规范
- DB65T 2201-2014 新疆主要造林树种苗木质量分级
- 高校教学副院长工作汇报
评论
0/150
提交评论