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