理论教育 编译器设计之路-数据结构

编译器设计之路-数据结构

时间:2023-11-04 理论教育 版权反馈
【摘要】:下面就来看看词法分析器的相关数据结构。词法分析器相关的数据结构主要包括:转换表、关键字表、常量表及其单词流。通常用二维数组表示,数组元素可以根据实际情况而定,Neo Pascal的转换表元素为整型。这是早期编译器不使用这一方案实现词法分析器的最重要原因。2.关键字表关键字表用于存储Neo Pascal的系统关键字及其ID。map的内核是一种红黑树结构,其查找效率近似于哈希表,属于比较高效的。

编译器设计之路-数据结构

下面就来看看词法分析器的相关数据结构。词法分析器相关的数据结构主要包括:转换表、关键字表、常量表及其单词流。常量表暂不作详述,将在第4章详细分析。

1.转换表

转换表是词法分析器的核心。通常用二维数组表示,数组元素可以根据实际情况而定,Neo Pascal的转换表元素为整型。转换表的声明形式如下:

【声明2-2】

第1维表示状态集,第2维表示Neo Pascal允许输入的字符集。Neo Pascal允许输入的字符集是指源程序文本中允许输入字符的集合。由于Neo Pascal语言中组成关键字、运算符、界符、标识符的字符ASCII码都小于或等于127,而ASCII码大于127的字符只可能出现在字符串或注释中,因此,所有ASCII码大于127的字符在转换表中用一列表示。这样,转换表可以表示为一个42行128列的二维表。

简单估算一下转换表所占的内存空间大约为21KB,不难发现,使用转换表实现的词法分析器的最大缺点就是所消耗的存储空间比较大。这是早期编译器不使用这一方案实现词法分析器的最重要原因。然而,对于今天的计算机而言,21KB的存储耗费是完全可以接受的。当然,有时也可以应用一些空间压缩技术以节省存储消耗,不过,这可能是以更多的时间耗费为代价的。

2.关键字表

关键字表用于存储Neo Pascal的系统关键字及其ID。由于关键字也是符合标识符的定义的,故在词法分析时完全按照标识符的词法定义识别单词。完成标识符识别之后(即进入终止状态-01),再查找关键字表,确定该标识符是否为关键字。如果是,则返回其ID。故关键字表一般包含两个字段:关键字名、ID。

由于每次识别完一个标识符后,都必须查找关键字表,故关键字表的查找效率至关重要。常用的查找算法比较多,例如,顺序、折半、哈希表、B-树、B+树等。这里,选择STL中的map结构来描述关键字表。map的内核是一种红黑树结构,其查找效率近似于哈希表,属于比较高效的。关键字表的声明形式如下:

【声明2-3】(www.daowen.com)

3.单词流

将词法分析作为独立的一遍,则必须借助于单词流。单词的声明形式如下:

【声明2-4】

其中LineInfo结构用于描述单词行号信息,单词行号信息的声明形式如下:

【声明2-5】

由于单词流的所有元素都是由单词组成的,为了使用方便,这里使用C++的vector容器代替传统的数组。vector容器是C++的STL的类,单词流的声明形式如下:

【声明2-6】

vector<CToken> TokenList;

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈