- 1、本文档共100页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 类型检查 内容 类型系统 类型表达式的等价 类型转换 函数和运算符的重载 多态函数 一致化算法 静态检查(static checking) 类型检查(type check) 操作对象必须与操作符匹配:函数名相加× 控制流检查(flow-of-control check) break必须退出while、for、switch… 唯一性检查(uniqueness check) 对象(变量、标号…)定义必须唯一 名字关联检查(name-related check) 相同名字在不同位置 类型检查 检查语法结构的类型与上下文匹配 简单的类型检查 两个类型的匹配 代码生成要利用类型信息 重载,多态 6.1 类型系统 语法结构、类型、将类型赋予语法结构 +, -, *的两个运算数均为整数,结果为整数 的结果为指向操作对象的指针,若操作对象类型为T,结果类型为“指向T的指针” 每个表达式都有一个相关联的类型 类型是有结构的!——指针 基本类型:语言内部支持类型 结构类型:组合基本类型构成新类型 6.1.1 类型表达式 type expression——用以表示语言结构的类型 基本类型或用类型构造符组合基本类型 基本类型:boolean, char, integer, real, type_error, void 类型名 类型表达式(续) 类型构造符 数组:T是类型表达式,I为索引集合(整数范围),则array(I, T)是一个类型表达式,表示元素为类型T的数组类型int A[10];——array({0, …, 9}, integer) 笛卡儿积:T1、T2为类型表达式,则T1×T2为类型表达式 类型表达式(续) 记录:与笛卡儿积的不同之处仅在于记录的域有名字。域名,域类型元组typedef struct { int address; char lexeme[15];} row;row table[101];类型表达式为:record((address×integer)× (lexeme×array({0, …, 15}, char))) 类型表达式(续) 指针:T为类型表达式,则pointer(T)为类型表达式,表示“指向类型为T的对象的指针”类型row *p;——pointer(row) 函数:数学上,一个集合“定义域”到另一个集合“值域”的映射。程序语言,定义域类型D到值域类型R的映射:D?R。%运算符——(int×int)?intint *f(char a, char b);——(char×char)?pointer(integer)不考虑函数返回数组、函数类型的情况(integer?integer)?(integer?integer) 可使用类型表达式变量 图表示类型表达式 (char×char)?pointer(integer) 6.1.2 类型系统 type system:规则的集合规则——将类型表达式赋予程序的不同部分 类型检查程序:实现一个类型系统 语法制导方式实现——嵌入语义规则 6.1.2静态/动态检查 静态——编译器进行动态——运行时进行 可靠类型系统,强类型语言——编译器无type_error?运行时无类型错误 int a[10], i; b=a[i];——需动态检查 安全领域也涉及类型检查(缓冲溢出问题) 6.1.4 错误恢复 最低要求:报告类型错误位置 错误处理应融入规则中 错误修正比描述正确程序更困难 根据错误的程序、处理缺失信息,来推测正确类型??在变量使用之前无需定义它 类型变量可用来处理这种问题 6.2 一个简单的类型检查器 6.2.1 一种简单语言 用综合属性type保存类型表达式 P ? D ; E D ? D ; D | id : T T ? char | integer | array [ num ] of T | ^T E ? literal | num | id | E mod E | E [E] | E^ 基本类型:char、integer、type_error 例 CODE Some Types Expressions key:integer; array[256] of char array(1..256, char) key mod 1999 ^integer pointer(integer) 翻译模式 P ? D ; E { } D ? D ; D { } D ? id : T { addtype(id.entry, T.type) } T ? char {T.type = char } T ? integer {T.type = integer } T ? arr
文档评论(0)