理论教育 Pascal的类型-从《编译器设计之路》带来的类型成果

Pascal的类型-从《编译器设计之路》带来的类型成果

时间:2023-11-04 理论教育 版权反馈
【摘要】:1.类型简介Pascal语言的数据类型非常丰富。Pascal的枚举与C语言的枚举基本类似。Pascal规定枚举类型的枚举值个数不允许超过255个。Pascal对集合元素类型有严格的规定,集合元素的类型必须是有序类型,且所有元素值必须界于0~255之间。Pascal的记录类型综合了C语言的结构、联合的基本功能,其包含两类字段:不变字段、可变字段。标准Pascal并不提供无类型的指针,不过,一些商用编译器对此进行了扩展。

Pascal的类型-从《编译器设计之路》带来的类型成果

1.类型简介

Pascal语言的数据类型非常丰富。关于Pascal语言数据类型的分类标准并不唯一,笔者从编译器设计观点出发,将数据类型分为三类:基本类型(也可以称为简单类型)、构造类型、指针类型。

基本类型主要包含:整型、实型、字符型、字符串型、布尔型、枚举型。

构造类型主要包含:数组、记录(相当于C语言的结构)、集合、文件、函数过程等。

指针类型主要包含:数据指针。

标准Pascal语言中引入了函数过程类型,该类型源于函数式语言,在命令式语言中并不多见。Pascal语言的函数过程类型与C语言的函数指针比较类似,实现机制相似,但还是存在概念的差别。不过,一些商用Pascal编译器已经不再区别函数指针与函数过程类型,统一使用函数指针实现。函数指针是现代程序设计语言的一个重要机制,对于面向对象编译技术研究具有现实意义,故后续章节中将深入讨论函数指针的实现技术。

2.基本类型

根据不同的精度要求,C编译器的实型、整型还可以细化为长整型、短整型、32位整型、单精度实型、双精度实型等。同样,各种版本的Pascal编译器也对整型、实型进行了细化。Neo Pascal编译器参考了Delphi语言的数据类型,实现了其中最为常用的12种基本类型,见表1-4。

表1-4 Neo Pascal基本数据类型

978-7-111-32164-4-Chapter01-19.jpg

3.枚举类型

枚举类型( enum)通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序是一致的。Pascal的枚举与C语言的枚举基本类似。Pascal规定枚举类型的枚举值个数不允许超过255个。

声明格式:

978-7-111-32164-4-Chapter01-20.jpg

例如:978-7-111-32164-4-Chapter01-21.jpg

4.集合类型

Pascal的集合(set)类型源自数学的集合概念。集合是以己知有序类型值的列表构造而成的,称己知序数类型为基类型。Pascal对集合元素类型有严格的规定,集合元素的类型必须是有序类型,且所有元素值必须界于0~255之间。因此,基本类型中的BYTE、CHAR类型及枚举类型是有效的集合基类型。在标准Pascal中,还可以是子界类型,而Neo Pascal并不支持子界类型。与数学的集合类似,集合元素之间是不存在顺序关系的,即集合[2,3]与[3,2]是相等的。

声明格式:

978-7-111-32164-4-Chapter01-22.jpg

例如: a:set of char;

表示一个集合值的最通用的方法是逐个枚举集合的元素,并用方括号[]括起来。

例如:

[3,9,15,23]:表示由3,9,15,23组成的集合。

[’l’,’p’,’z’]:表示由字符1,p,z组成的集合。

集合的运算:

+: 集合“并”运算。

*: 集合“交”运算。

: 集合“差”运算。

=: 检查两个集合所包含的元素是否相同。

<>: 检查两个集合是否不相等。

<=: 检查第一个集合中的元素是否都在第二个集合中出现。

>=: 检查第一个集合中的元素是否包含第二个集合中的所有元素。(www.daowen.com)

in: 检查集合基类型的一个元素是否属于集合。

例如:[A,B,C]+[D]等于[A,B,C,D]。

[A,B,C]*[A]等于[A]。

[A,B,C]一[A]等于[B,C]。

[A,B,C]-[A,B,C]等于TRUE。

[A,B,C]<>[C,B,A]等于FALSE。

5.数组类型

数组类型( array)是程序中最常用的构造数据类型,用来描述由固定数量的同一类型的元素组成的数据结构。Pascal的数组与C语言的数组基本类似,唯一的不同就是Pascal的数组下标可以由用户定义。例如,用户可以定义一个下标从20开始的数组。而C语言规定数组下标从0开始。

声明格式:

978-7-111-32164-4-Chapter01-23.jpg

“下标类型”可以是任意有序类型。由于其他有序类型作为数组下标的实际意义不大,所以数组最常用的声明形式就是将子界类型作为“下标类型”的一种声明形式。不熟悉Pascal的读者对于子界类型可能不了解,在Neo Pascal中也省略了子界类型,这里读者只需了解子界类型实际上就是某一有序类型的一个子集。一般使用“下限..上限”形式表示子界类型。使用子界类型作为数组的下标类型的优点就是可以由用户指定数组的上、下限,这一特性是C语言不具备的。

例如:a:ARRAY[0..10,0..20]OF INTEGER;

C语言声明:int a[11][21];

6.记录类型

记录类型(record)是描述同一对象的一组类型可能不同的数据集合。使用记录类型实现了数据逻辑关系和存放形式上的一致。Pascal的记录类型综合了C语言的结构、联合的基本功能,其包含两类字段:不变字段、可变字段。记录类型的声明形式比较复杂,可能会对初次阅读产生障碍,读者只需了解即可,不必深究。

声明格式:

978-7-111-32164-4-Chapter01-24.jpg

例如:978-7-111-32164-4-Chapter01-25.jpg

C语言声明:978-7-111-32164-4-Chapter01-26.jpg

7.指针类型

指针(pointer)变量中存放的是某个存储单元地址,即指针变量指向的存储单元的地址。一个指针变量仅能指向某一种特定类型的存储单元,该数据类型是在指针声明时确定的,称为指针类型的基类型。标准Pascal并不提供无类型的指针,不过,一些商用编译器对此进行了扩展。

声明格式:

978-7-111-32164-4-Chapter01-27.jpg

例如:978-7-111-32164-4-Chapter01-28.jpg

C语言声明:978-7-111-32164-4-Chapter01-29.jpg

指针的运算:.

^:间接访问运算。获取指针所指向存储单元里的数据,与C语言的“*”运算类似。

@:地址运算。获取变量的地址,与C语言的“&”运算类似。

例如:

978-7-111-32164-4-Chapter01-30.jpg

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

我要反馈