- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章符号表2.0
;;为了便于查错和改错,可以记录前面是否已经打印过象“变量A未定义”这样的出错信息,以免重复。
对于多遍扫描的编译器,不同遍的表也往往不同。
本章主要讨论 :
设计表的主要问题是登记项的格式,
表的组织和访问的方法,
访问的格式,
存放的位置(主存或者辅存)。
;;我们要求它具备以下几种功能:
1,确定一个给定的名字是否在表中;
2,填入新的名字;
3,访问所给名字的有关信息;
4,对给定的名字,填写和更新它的有关息;
5,删除一个或者一组名字
;6.1.2 分表
语言中,名字表示各种类型的对象:变量名,过程名,常
数,域名(结构),标号等,由于各种类型的名字因用法
不同,栏目及所需的空间相差很大,因此往往独立建表,
由此带来的负面影响是:导致零头太多。如果登记项格式
可以变化,则另外一个表也可以;
如果禁止把关键字作为标识符,则应把关键字先进表,标
函也进表.;6.1.3 符号表内容的细目
1,表示名字的字符串+编号,如果多个程序块或过程中可以使用同一标识符,则必须指出这个名字属于哪一个程序块或过程;
2,名字的属性(包括类型和种类)以及识别名字用途的信息(标号, 形参,数组)
3,参数(维数,下标的上下界)
4,描述分配给名字存储单元的位置的偏移量;6.1.4 符号表登记项的建立
a, 符号表名字何时建立:
1,词法分析。当识别了一个标识符时,它可以建 立,不能填充种类,类型等; install 子程序返回 ($ID, 符号表指针);
2,但是当一个名字在同一个程序块或过程中,可用作标号、实型变量、域名时,词法只能返回($ID, TOKEN),由语法分析程序为标识符建表
;b, 这些信息在不同的时刻插入符号表:
1,遇到显式说明时,把属性插入;
2,语法可以隐含的说明变量的某种用途,如标号 后的 : ,所以和产生式
语句- id:语句
相关的语义动作是把 id 为标号的事实插入符号表,标号链,定义否填入;
3,地址分配;
类似,过程说明的语法告诉我们某些名字是形参。
;6.1.5 名字和符号表记录
实现表的最简单方式是看成记录的线性数组,每一栏??所占存储单元长度不变,每个名字对应一个记录,记录通常由已知个连续的存储字组成。;;1,当一个名字的最大长度不太长时,如FORTRAN为8字符, 用2个字存储,其余补空;
2,ALGOL 名字不限, PL/1 31个(8个字), 则采用间接方式,专门字符数组,这样使表的名字域大小不变;
对于其他的域也可以这样办理,(技术性工作).
;把整个符号表分成若干子表;6.1.6 符号表空间的重新使用
符号表占用空间很大,且信息更新,故有重新使用空间的问题,那些空间不可用呢?
程序员用来表示名字的标识符,必须一直保存在符号表中,直到不再引用为止,以便该标识符只能代表同一个名字,这是必要的,它使标识符的所有使用与符号表登记项相结合(表中有的内容在以后不再使用了),从而是同一个名字。
但是,如果用来存放标识符的空间在下一次能重新使用,那么用少量空间就能解决问题。;例如,在以后几遍中,放名字的数组可以释放,所以设法回收用来存储标识符的空间,(事实上,图9.1b 第一字也能回收)
方法:用两个而不是一个数组来存放记录;有效地加入新项和找出有关项,本节主要讨论三种机制:
;线形表的效率估计
插入名字的工作量与表长 n 成正比
查找的工作量平均 n/2
访问的工作量与表长 n 成正比.
;;1,自适应表Link 的原则;2,做法;3,算法:可以写出把NAME i 移到头上来的算法;算法:
1,若Link p = i, 则记下 p ;
若Link i = q, 则q ? Link p ;
//这样,i 就脱离了
2,若原FIRST ? r, 则记 r ? Link i ;
3, 让FIRST ? i;
;二,折半查找;进一步的改进;评价;
left;构造过程:;评价;思考:;三,直接取表法;优点:;四,混列表 (hash table, computed entry table, scatter table);混列表---定义;A, 开放的混列表;;定语开放:;需要考虑的问题:;B, 溢出混列--- 表未满的溢出项处理:
溢出项插入到一个完全独立的表中,如果溢出项不多,可用线性
查表法作溢出表的工作;
如果表很大,此法有局限性。;D,使用内链的溢出混列:;映像函数的构造:;方法:;6.3 名字的作用范围 ;二,FORTRAN 的符号表组织:;2, 多遍扫描:
处理完一段之后,应该把它的局部名表保存到外存中,因为后续遍要
用
注意:
1, 由于符号表的现行局部名表是可覆盖的,当词法分析后,名字的
字符串已经由符
文档评论(0)