有自己的类型机制,包括类型说明和使用。类型分析是编.ppt

有自己的类型机制,包括类型说明和使用。类型分析是编.ppt

有自己的类型机制,包括类型说明和使用。类型分析是编.ppt

5.8 类型分析? 每个程序设计语言都有自己的类型机制,包括类型说明和使用。 ? 类型分析是编译器语义分析的重要组成部分?。编译器首先根据类型说明,确定每一个变量和常量的类型?,计算其使用存储空间的大小,从而建立其到存储空间的映射。进而,编译器要确定每个语言结构的类型,以完成下面的主要任务: (1) 判定重载算符(函数)在程序中代表是那一个运算;(2) 进行类型转换;(3) 对语言结构进行类型检查。;5.8.1 类型表达式 ?5.8.1.1 类型表达式定义 ??? ?语言结构的类型由类型表达式指称,类型表达式依赖于程序语言的类型体制。类型表达式或者是简单类型表达式,或者是构造符作用在类型表达式上得到的类型表达式。类型表达式的定义如下: ???(1) 类型名和基本类型是类型表达式。integer、char、real、boolean是基本类型,所以它们是类型表达式。另外,void表示“无类型”,type_error表示“出错类型”,它们也是类型表达式。;??(2)类型构造符作用于类型表达式的结果 仍然是类型表达式。类型构造符包括: ??(a)数组构造符ARRAY:若T是类型表达 式,则ARRAY(I,T)是类型表达式。 (b)笛卡儿乘积?:若T1、T2是类型表达 式,则T1? T2是类型表达式,且?是左结合。 ? (c)记录类型构造符RECORD:若有标识符N1、N2……、Nn与类型表达式T1、T2、 …、Tn, 则RECORD((N1 ? T1) ? (N2 ? T2)? …? (Nn ? Tn))是一个类型表达式,它指称一个记录类型。 ;???(d)指针类型构造符POINTER:若T是类 型 表达式,则POINTER(T)是类型表达式,它指称一个指针类型。 ???(e)函数类型构造符→:若D1、D2、…、 Dn和R是类型表达式,则D1?D2 ? ……? Dn →R是类型表达式,其中?优先于→,它指称 从定义域类型D1 ? D2 ? … ? Dn到值域类型R 的映射。 ??(3) 类型表达式中可出现类型变量,变量 值是类型表达式。;例5.23 ?设有Pascal 程序片段: ?TYPE stype=RECORD ??? ????????? name:ARRAY [1..8] OF char; ??? ??????? score:integer ??? ???????? END; ?VAR ??table:ARRAY [1..50] OF stype; ??? ?? ?p: ↑stype; 则stype代表的类型表达式 ?????RECORD((name?ARRAY(1..8,char)) ? (score ? integer)) 和table绑定的类型表达式 ARRAY(1..50,stype) 和P绑定的类型表达式 ?POINTER(stype) ;?例5.24 ?设有下面的函数定义 ??? FUNCTION f(P1:T1;P2:T2;…,Pn:Tn):T; ??? BEGIN ……END; 和f绑定的类型表达式 T1?T2 ? … ? Tn→T ?例5.25 ?在函数式语言中可如下定义恒等函数 ??? fun f(x)=x ? x可以是任何类型的语言结构。因此x可以是任何类型。f的类型表达式为?? ???? ??? ?为类型变量,其值是任何类型表达式。;?类型表达式的表达方法 ???1.树:内部结点是类型构造符,叶结点是基本 类型,类型名或类型变量。例如, FUNCTION f (a,b:char):?integer: ……… char?char?pointer(integer);2.位串(对类型表达式作某些限制) 例如,考虑由POINTER、→和ARRAY 作为 构造符的类型表达式。Pointer(t)表示指向类 型为t的指针,freturns(t)表示若干变元的函 数, 其中t为函数返回对象的类型, 而函数变 元的类型则存放在其它地方。ARRAY(t) 表 示元素类型为t 的数组,而数组元素的个数 保存在其它地方。这样,构造符都成为一元 算符,它们作用于 基本类型形成的类型表达 式有非常统一的结 构。; 类型构造符 编码 pointer 01 array 10

文档评论(0)

1亿VIP精品文档

相关文档