- 1、本文档共51页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九章符 号 表 广东工业大学计算机学院 引言 符号表作为编译系统的重要设施,贯穿于文法分析、检查和语义处理的编译全过程。 在编译程序中符号表用来存放源程序中出现的有关名字的属性信息,这些信息集中反映了名字的语义特征属性。 符号表总体结构的设计和实现下列因素有关: 源语言的复杂性(包括词法结构、语法结构的复杂性) 对于编译系统在时间效率和空间效率方面的要求 Contents 本课内容 9.1 符号表的作用和地位 9.2 符号的主要属性及作用 9.3 符号表的组织 9.4 符号表的管理 符号表的功能 符号表中所登记的信息在编译的不同阶段都要用到。例如:在词法分析及语法分析过程中不断更新表中的信息, 另外,在词法分析到代码生成的各阶段则会从表中获取不同的属性信息。 符号表的功能主要归结为以下几个方面: ① 收集符号属性 ② 作为上下文语义的合法性检查的依据 ③ 作为目标代码生成阶段地址分配的依据 1. 收集符号属性 编译程序扫描说明部分收集有关标识符的属性,并在符号表中建立符号的相应属性信息。 例如:编译程序分析到下述两个说明语句: int A; float B[5]; 则在符号表中收集到关于符号A的属性是一个整型变量,关于符号B的属性是具有5个浮点型元素的一维数组。 2. 作为上下文语义的合法性检查的依据 通过符号表中属性记录可进行相应上下文的语义检查。 例如:在一个C语言程序中出现 int i[3,5]; //定义整型数组i … float i[4,2]; //定义实型数组i,重定义冲突 … int i[3,5]; //定义整型数组i,重定义冲突 从本例还可以看出,无论在后面两句中i的其它属性与前一句是否完全相同,只要标识符名重定义,就将产生重定义冲突的语义错误。 3. 作为目标代码生成阶段地址分配的依据 每个符号变量在目标代码生成时需要确定其在存储分配中的位置(主要是相对位置)。 要确定一个变量在目标代码生成时的地址,需要: 首先要确定其被分配的区域。例如,在C语言中有公共区、文件静态区、函数静态区、函数运行时的动态区等。 其次是根据变量出现的次序。通常使用在该区域中相对于区头的相对位置来决定该变量在某个区中所处的具体位置。 本课内容 9.1 符号表的作用和地位 9.2 符号的主要属性及作用 9.3 符号表的组织 9.4 符号表的管理 符号表的组成 信息栏包含许多子栏和标志位,用来记录相应名字和各种属性。 名字栏也称主栏。主栏的内容称为关键字(key word)。 符号表的属性概述 虽然不同的语言定义的标识符属性不尽相同,下列几种属性通常都是需要的: ① 符号名 ③ 符号的存储类别 ⑤ 符号变量的存储分配信息 ⑥ 符号的其它属性:数组内情向量、记录结构型的成员信息、函数及过程的形参 ① 符号名 符号表中设置一个符号名域,存放该标识符,该域通常就是符号表的关键字域。(书P205) ② 符号的类型 标识符中除过程标识符之外,函数和变量标识符都具有数据类型(data type)属性。对于函数的数据类型指的是该函数值的数据类型。基本数据类型有整型、实型、字符型、逻辑型(布尔型)及位组型等,符号的类型属性是在该符号的定义时得到。变量符号的类型属性决定了该变量的数据在存储空间的存储格式,还决定了在该变量上可以施加的运算操作。 ③ 符号的存储类别 大多数语言对变量的存储类别定义采用两种方式: (1) 用关键字指定。 例如在C语言中用static定义是属于文件的静态存储变量或属于函数内部的静态存储变量。 (2) 根据变量声明在程序中的位置来决定。 例如在C语言中,在函数体外定义的变量是缺省是程序的公共存储变量,而在函数体内定义的变量是该函数所独有的私有存储变量。 ④ 符号的作用域及可视性 一个变量的作用域即该变量可以出现的场合,也就是说在某个变量作用域范围内该变量是可引用的,这就是变量可视性的作用域规则。 但是变量可视性不仅仅取决于它的作用域,还有两种情况影响到一个变量的可视性。 ⑴ 函数的形式参数:影响变量可视性的举例 int a; // 外部定义的整型变量a int func(a, b) float a; // 函数内部定义的局部整型变量a, int b; { … b = b + a; // 引用的是哪一个a? … } 函数的形式参数(续) 在C语言的必威体育精装版文本中增加了一个语法记号∷,使得可以在函数内部显式地引用外部的同名变量。 上例可改写如下: int a = 2; int func (a, b) float a
文档评论(0)