实验一 符号表设计与实现
院系 信息科学与工程学院 班级 学号 . 姓名
1. 实验目的
了解符号表的作用、组织和数据结构,设计和实现一个符号表。 2. 实验要求
a)
针对四则运算,写出字符集∑、相应的词法单元集合、词法单元对应的正则表达式集合 b)
合理有效地设计符号表可存储四则运算中的各种词法单元及其属性等信息 c)
列出关键算法的具体实现的思路
3. 实验原理及内容 (1)符号表的作用
符号表用于登记词法单元名字、属性等信息。
由于在编译的各个阶段都要对符号表进行频繁操作(查表和填表),在整个编译时间中占了较大比例,因此如何有效合理地组织符号表并选择好的填表和查表方式,对于提高编译器的工作效率有很大影响。
(2)符号表的组织
每个词法单元在符号表中都有1个条目,一般由两部分组成:名字栏和信息栏。
如果一个语言对标识符的最大长度有限制,可设计名字栏的域大小为最大长度来容纳整个标识符;若该语言对标识符最大长度无限制或最大长度较大(如:32),为节省存储空间,可另用一个字符数组存储标识符,在名字栏域中存储其起始地址和长度(字符个数)。
运算表达式中的词法单元与具有某种类型属性的数据对象相关联。同一个标识符在不同位置被说明时代表不同的数据对象。当出现对一个标识符的引用时,需根据运算规则查符号表获取正确的符号表条目。
(3)符号表的数据结构
由于线性表的访问复杂度为O(n),效率较低,符号表常采用效率更高的哈希技术进行实现: 当出现标识符id的定义时,计算哈希函数H(id),获取其在哈希表的存储位置,如该位置为空,则直接存储,否则应用冲突消解方法来获取其存储位置;当出现对标识符id的引用时,计算哈希函数H(id),获取其在哈希表的存储位置。 4. 实验软硬件环境
C++
Microsoft Visual Studio 6.0
5. 符号表的设计与实现的算法思想
由于线性表的访问复杂度为O(n),效率较低,符号表常采用效率更高的哈希技术进行实现: 当出现标识符id的定义时,计算哈希函数H(id),获取其在哈希表的存储位置,如该位置为空,则直接存储,否则应用冲突消解方法来获取其存储位置;当出现对标识符id的引用时,计算哈希函数H(id),获取其在哈希表的存储位置。 (1) 主程序示意图如图所示:
置初值 调用switch选择要进行的操作 调用不同case中的方法
结束
(2) Insert分析程序示意图如图所示:
(3) Find分析程序示意图如图所示:
输入表名
是否存在表 是 否
调用 insert函数
是否存在表 是 否
调用read读入函数 将表信息存入哈希表中 出错处理 调用find函数 在哈希表中找到表信息 提示不存在 结束返回表信息
(4) Remove分析程序示意图如图所示:
(5) Show分析程序示意图如图所示:
调用 show
结束显示哈希 列表中表信息
输入表名(key)
是否存在表 是 否
调用remove函数 结束显示删除成功 提示删除失败 6.符号表设计与实现主要代码
1.代码:
bool CHashTable:: Insert(CRecord& record)//在哈希表中插入表 { list
return false; }
OldList.push_back(record); m_nCurrentSize++; return true; }
bool CHashTable:: Find (char* key)//通过关键字在哈希表中找到表,显示表信息 { list
cout << \查找结果:\ } }
return false; }
bool CHashTable:: Remove( char* key)//输入关键字,删除哈希列表中的表及信息 { list
OldList.erase(it); m_nCurrentSize--; return true; } }
return false; }
void CHashTable:: Show()//打印哈希列表中的表及其表信息 { for (int i = 0; i < 101; i++) { list
for (it = m_Array[i].begin(); it != m_Array[i].end(); it++) {
it->Show(); } } }
2. 结果分析