编译原理与技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struct person {
struct school {
char * name;
char * name;
char * address;
char * address;
int age;
int age;
} a;
} b;
-“类型体制”也就是将类型表达式指派到语言结 构上的规则(集合),而类型检查则是来实现这个 类型体制。
2020/10/24
《编译原理与技术》-类型检查
3
基本类型
C long double
类型加宽 (Widening)
double
float
long long
unsigned
long
int
short char
a = &x; *a = …
Java
Pascal
Integer Ref;
var p : ^ integer;
new(p);
Ref = new Integer(15);
Ref . intValue() ;
p := …
p^ := …
2020/10/24
《编译原理与技术》-类型检查
7
void 类型 - 返回类型、空参数列表 如C中:void foo( void ) - cast 如: int foo(…) (void) foo(…) - 通用指针 如C中,int *ptr ; … (void *) ptr
编译原理与技术
类型检查
2020/10/24
《编译原理与技术》-类型检查
1
类型体制 类型检查
- 类型等价 类型转换
- 隐式转换 - 显式转换 类型推导 - 算符重载
类型检查
2020/10/24
《编译原理与技术》-类型检查
2
类型体制
程序设计语言中的类型
- 类型代表着某类值(域)的集合,如整型(数)、 实型(数)、字符串等。
2020/10/24
《编译原理与技术》-类型检查
8
类型表达式 语言结构的类型可表示为类型表达式。 - 基本类型可作为类型表达式; - 类型名也可以是类型表达式; - 采用类型构造器作用于类型表达式上,可以得到 新的类型表达式。 (1)数组:array( I, T ) ; I 、T分别为下标与数组 元素的类型; (2)积:x ; 如 T1 x T2 ; (3)记录:record ( (域名x域类型) 的积 ) (4)指针: pointer( T ) ; T 为所指对象类型 (5)函数:参数类型的积 结果类型 - 类型表达式可以含(类型)变量。
2020/10/24
《编译原理与技术》-类型检查
10
e.g. 给出以下函数的类型表达式:
student * enter( char * name, int age, float score
) 函数enter的类型表达式为:
( pointer(char) x int x float ) pointer( student)
类型窄化(Narrowing) 必须做type-cast
Java double float long int short char byte boolean
2020/10/24
《编译原理与技术》-类型检查
4
复合类型
- 结构/记录(不同类型的对象聚集)
C
Pascal
struct foo {
RECORD
int a;
var a : integer;
float b;
var b : real;
};
END ;
struct foo X;
X.a = …
- 联合/变体(union/variant)
- 位域(bit fields)
2020/10/24
《编译原理与技术》-类型检查
5
复合类型
- 数组(相同类型的对象聚集)
2020/10/24
《编译原理与技术》-类型检查
9
e.g. 给出以下声明的类型表达式: typedef struct { char name[32]; int age; float score; } student; student stu1, stu2; //stu1的类型表达式如下: record( (name x array(0..31, char) ) x (age x int ) x (score x float ) )
2020/10/24
《编译原理与技术》-类型检查
11
类型检查
类型检查就是语言类型体制的“实现” 如: 运算符mod(或C中的%)一般要求参与运算 的左、右表达式类型均为整型(或兼容类型),那 么可以将此类型检查“形式化”为: EE1 mod E2 { if (E1.type == INT) and (E2.type == INT) then E.type :=INT else E.type := type_error }
《编译原理与技术》-类型检查
13
类型等价
- 确定两个名字或值是否具有“相同”的类型
结构等价:structure equivalence
两个类型结构等价,如果它们的组成成分相同且组织方 式相同;是一种面向实现“较低级”的“类型检查”;
存在问题:不能区分那些虽然内部结构完全相同,但其 实确为不同的类型。如C的2个结构定义:
- 类型本身具有结构;多数语言提供称为基本类型 或预定义类型的“内建”类型,如C的int,char和 double。同时可以应用类型构造器作用于基本类型 得到“复合类型”,常见的类型构造器有 record/struct、array、set、pointer、function等。
- 用“类型表达式”来表示具有类型的语言结构
C
Java
Pascal
int a[11];
int [ ] a; var a : array [0..10] of
integer;
a[0] = … a = new int[11]; a[0] := …
2020/10/24
《编译原理与技术》-类型检查
6
复合类型 - 指针 C int *a; int x = 11;
2020/10/24
《编译原理与技术》-类型检查
12ຫໍສະໝຸດ Baidu
而数组元素的类型检查可描述如下: EE1 [ E2 ] { if (E1.type == array(s,t) ) and
(E2.type == s) then E.type := t else E.type := type_error }
2020/10/24