1符号表的设计和实现.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
符号表的设计与实现 实验目的 了解符号表的作用、组织和数据结构,设计和实现一个符号表。 实验要求 合理有效地设计符号表可存储程序语言中的各种标识符(变量、常量、数组、结构、指针、函数和过程)及其属性和作用域信息 列出关键算法的具体实现的思路 实验原理及内容 (1)符号表的作用 符号表用于登录名字(标识符)、相应对象的种类(常量、变量、数组、结构、文件、标号、指针、函数与过程等)、属性(整型、实型、字符型、布尔型与枚举型等)和作用域信息。 由于在编译的各个阶段都要对符号表进行频繁操作(查表和填表),在整个编译时间中占了较大比例,因此如何有效合理地组织符号表并选择好的填表和查表方式,对于提高编译器的工作效率有很大影响。 (2)符号表的组织 源程序中的每个标识符在符号表中都有1个条目,一般由两部分组成:名字栏和信息栏。 如果一个语言对标识符的最大长度有限制,可设计名字栏的域大小为最大长度来容纳整个标识符;若该语言对标识符最大长度无限制或最大长度较大(如:32),为节省存储空间,可另用一个字符数组存储标识符,在名字栏域中存储其起始地址和长度(字符个数)。 源程序中的标识符种类繁多,不同种类的标识符所需要存储的信息不同。如:变量需存储其类型、存储地址等,数组应存储其数组维数m、数组元素类型T、各维元素个数 di、起始地址base等,指针应存储其指向对象类型的位置,函数应存储其参数及类型、返回值类型等…… 源程序中的说明将标识符与具有某种类型属性的数据对象相关联。同一个标识符在不同程序位置被说明时代表不同的数据对象。当出现对一个标识符的引用时,需根据作用域规则查符号表获取正确的符号表条目。C语言采用静态作用域规则,按最近嵌套原则确定作用域。 符号表的设计与实现的算法思想 由于线性表的访问复杂度为O(n),效率较低,符号表常采用效率更高的哈希技术进行实现: 当出现标识符id的定义时,计算哈希函数H(id),获取其在哈希表的存储位置,如该位置为空,则直接存储,否则应用冲突消解方法来获取其存储位置;当出现对标识符id的引用时,计算哈希函数H(id),获取其在哈希表的存储位置。 主程序示意图如图4-1所示。 图4-1 符号表设计与实现主程序示意图 Insert分析程序示意图如图4-2所示。 否 是 图4-2 insert分析函数示意图 Find分析程序示意图如图4-3所示。 否 是 图4-3 find分析函数示意图 Remove分析程序示意图如图4-4所示。 否 是 图4-4 remove分析函数示意图 Show分析程序示意图如图4-5所示。 图4-5 show分析函数示意图 符号表设计与实现主要代码 bool CHashTable:: Insert(CRecord record)//在哈希表中插入表 { listCRecord OldList = m_Array[MyHash(record.GetKey())]; if (find(OldList.begin(), OldList.end(), record) != OldList.end()) { return false; } OldList.push_back(record); m_nCurrentSize++; return true; } bool CHashTable:: Find (char* key)//通过关键字在哈希表中找到表,显示表信息 { listCRecord OldList = m_Array[MyHash(key)]; listCRecord:: iterator it; for (it = OldList.begin(); it != OldList.end(); it++) { if (strcmp(key, it-GetKey()) == 0) { system(cls); cout 查找结果: endl; this-PrintHead(); it-Show(); return true; } } return false; } bool CHashTable:: Remove( char* key)//输入关键字,删除哈希列表中的表及信息 { listCRecord OldList = m_Array[MyHash(key)]; listCRecord:: iterator it; for (it = OldList.begin(); it != OldList.end(); it++) { if (strcmp(key, it-

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档