欢迎来到天天文库
浏览记录
ID:39385338
大小:748.81 KB
页数:38页
时间:2019-07-02
《西安电子科技大学《编译原理》》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、4.4声明语句的翻译声明语句的作用是为可执行语句提供信息,以便于其执行。对声明语句的处理,主要是将所需要的信息正确地填写进合理组织的符号表中。4.4.1变量的声明<1>变量的类型定义与声明类型定义:为编译器提供存储空间大小的信息变量声明:为变量分配存储空间组合数据的类型定义和变量声明:定义与声明在一起,定义与声明分离。定义确定存储空间,声明分配存储空间简单数据类型的存储空间是已经确定的,如integer可以占4个字节,real可以占8个字节,char可以占1个字节等。组合数据类型变量的存储空间,需要编译器根据程序员提供的信息计算而定。1<1>变量的类型定义与声明例:在Pascal程
2、序中的类型定义与变量声明:先定义后声明:typeplayer=array[1..2]ofinteger;matrix=array[1..24]ofchar;varc,p:player;winner:boolean;display:matrix;movect:integer;定义与声明同时:varc,p:array[1..2]ofinteger;display:array[1..24]ofchar;强调:简单变量声明中类型是预定义的;组合变量声明中类型需自己定义。(定义的两种形式)2<2>变量声明的语法制导翻译(a)变量声明的文法:D→D;D(1)
3、id:T(2)T→int(3)
4、r
5、eal(4)
6、array[num]ofT(5)
7、^T(6)产生式(5)是数组类型的声明,其中的数组元素个数由num表示,如num可以是5或10等,这是一个简化了的表示方法,它等价于1..5或1..10。产生式(6)是指针类型的声明,它的宽度(大小)是一个常量。数组元素的类型和指针所指对象的类型可以是任意合法的类型。此文法可以声明多维数组,如数组A的声明形式可以是:A:array[d1]ofarray[d2]of...array[dn]ofinteger多维数组以行为主存储。因为:第一维是有d1个元素的一维数组,每个元素又是一个n-1维的数组;依此类推。3<2>变量声明的语法制导翻译
8、(续1)(b)填写符号表信息的语法制导翻译全程量offset:记录当前被处理符号存储的偏移量,初值设为0属性.type和.width:变量的类型和所占据的存储空间过程enter(name,type,offset):为type类型的变量name建立符号表条目,并为其分配存储空间(位置)offset(1)D→D;D(2)D→id:T(3)T→int(4)T→real(5)T→array[num]ofT1(6)T→^T1{enter(id.name,T.type,offset);offset:=offset+T.width;}{T.type:=integer;T.width:=4;}{T
9、.type:=real;T.width:=8;}{T.type:=array(num.val,T1.type);T.width:=num.val*T1.width;}{T.type:=pointer(T1.type);T.width:=4;}4<2>变量声明的语法制导翻译(续2)例声明序列的语法制导翻译:a:array[10]ofint;x:int;序号归约使用的产生式语义处理结果(1)T1→intT1.type=integerT1.width=4(2)T2→array[num]ofT1T2.type=array(10,integer)T2.width=10*4=40(3)D1→i
10、d:T2enter(a,array(10),0)offset=40(4)T3→intT3.type=integerT3.width=4(5)D2→id:T3enter(x,integer,40)offset=44(2)D→id:T{enter(id.name,T.type,offset);offset:=offset+T.width;}(3)T→int{T.type:=integer;T.width:=4;}(5)T→array[num]ofT1{T.type:=array(num.val,T1.type);T.width:=num.val*T1.width;}(6)T→^T1{T
11、.type:=pointer(T1.type);T.width:=4;}54.4.3过程的定义与声明1.过程(procedure):过程头(做什么)+过程体(怎么做);函数;主程序2.过程的三种形式:过程定义、过程声明和过程调用。例:Ada过程定义:procedureswap(x,y:inoutinteger)is--规格说明temp:integer;--体中的声明begintemp:=x;x:=y;y:=temp;--可执行语句序列endswap;声明与引用:pro
此文档下载收益归作者所有