第4章语法制导翻译生成中间代码_1n.ppt

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章语法制导翻译生成中间代码_1n

* 3 散列函数的计算(续1) P.J.Weinberger的C编译器中使用的散列函数: #include iostream.h const int PRIME=211; const int EOS=\0; int hashpjw(char *s) { char *p; unsigned h=0, g; for (p=s; *p!=EOS; p++) { h=(h4)+(*p); if (g=h0xf0000000) { h=h^(g24); h=h^g; } } return h%PRIME; } * 4.4 声明语句的翻译 声明语句的作用是为可执行语句提供信息,以便于其执行。对声明语句的处理,主要是将所需要的信息正确地填写进合理组织的符号表中。 4.4.1 变量的声明 1 变量的类型定义与声明 类型定义:为编译器提供存储空间大小的信息 变量声明:为变量分配存储空间 组合数据的类型定义和变量声明: 定义与声明在一起,定义与声明分离。 定义确定存储空间,声明分配存储空间 简单数据类型的存储空间是已经确定的,如integer可以占4个字节,real可以占8个字节,char可以占1个字节等。 组合数据类型变量的存储空间,需要编译器根据程序员提供的信息计算而定。 * 1 变量的类型定义与声明 例:在Pascal程序中的类型定义与变量声明: 先定义类型后声明: type player = array[1..2] of integer; matrix = array[1..24] of char; var c, p : player; winner : boolean; display : matrix; movect : integer; 强调: 简单变量声明中类型是预定义的; 组合变量声明中类型需自己定义。 定义与声明同时: var c, p : array[1..2] of integer; display : array[1..24] of char; * 2 变量声明的语法制导翻译 (a) 变量声明的文法: D → D ; D (1) | id : T (2) T → int (3) | real (4) | array [num] of T (5) | ^T (6) 产生式(5)是数组类型的声明,其中的数组元素个数由num表示,如num可以是5或10等,这是一个简化了的表示方法,它等价于1..5或1..10。 产生式(6)是指针类型的声明,其宽度(大小)是一个常量。数组元素的类型和指针所指对象的类型可以是任意合法类型。 此文法可以声明多维数组,如数组A的声明形式可以是: A : array [d1] of array [d2] of ... array [dn] of int 此多维数组以行为主存储。 因为: 第一维是有d1个元素的一维数组,每个元素又是一个n-1维的数组;依此类推。 * 2 变量声明的语法制导翻译(续2) 例 声明的语法制导翻译: a : array [10] of int; x : int; 考虑此语句要写入符号表中什么信息? 记录各个变量声明信息(名字、类型) 以后分配存储空间也需要参考此表,因此需要记录存储偏移量。 需要为文法符号定义些什么属性? 需要定义什么功能的过程? 规约时需要做什么操作,才能将相应信息填入符号表? 语法分析树 * 2 变量声明的语法制导翻译(续1) (b) 填写符号表信息的语法制导翻译 全程量offset:记录当前符号存储的偏移量,初值设为0 属性.type和.width:变量的类型和所占据的存储空间(或宽度), .width主要是为了计算offset。 过程enter(name, type, offset):为type类型的变量name建立符号表条目,并为其分配存储空间(位置)offset * 2 变量声明的语法制导翻译(续1) (1)D→D;D (2)D→id:T (3)T→int (4)T→real (5)T→array [num] of T1 (6)T→^T1 语义规则: {enter(id.name, T.type, offset); //建立符号表 offset:=offset+T.width;} {T.type:=integer; T.width:=4;} {T.type:=real; T.width:=8;} {T.type:=array(num.val, T1.ty

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档