- 1、本文档共106页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
语句的类型检查 很多语言中语句没有值,我们给它们赋予一个基本类型void,错误类型是type_error。 P→D;S S→id:=E {if id.type = E.type then S.type := void else S.type := type_error} S→if E then S1 {E.type := boolean then S.type := S1.type else S.type := type_error} S→while E do S1 {if E.type = boolean then S.type:= S1.type else S.type:= type_error} S→S1;S2 {if S1.tpye = void and S2.type = void then S.type := void else S.type := type_error} 函数的类型检查 带有参数的函数引用可由下面产生式描述: E→E(E) 对函数类型的说明 T→T1 ‘→’ T2 {T.type := T1.type → T2.type} 对函数引用的类型检查规则 E→E1(E2) {if E2.type =s and E1.type = s→t then E.type := t else E.type := type_error} 当函数有N个参数时,我们把它们看成一个参数的类型T1×T2 ×… ×Tn root: (real→real)×real→real function root(function f(y:real):real; x:real):real 错误恢复 对类型检查器来说,发现错误时执行的操作: 至少必须能够报告错误的性质和位置 从错误中恢复,以便检查剩下的输入 因此,类型检查的规则必须要在设计时就准备处理各种错误。 函数和运算符的重载 例如,在Ada语言中,*的重载说明使得*可能的类型包括: integer×integer→integer integer×integer→complex complex×complex→complex 产生式 语义规则 E’→E E’.types := E.type E→id E.types := lookup(id.entry) E→E1(E2) E.types := {t | s∈E2.type, s→t∈E1.type} 多态函数 多态函数吸引人之处在于它能实现对数据结构进行操作的算法,而不管数据结构的元素类型是什么。 将代表类型表达式的变量用作表示未知类型,如αβγ等 用一个变量代表未说明的标识符的类型,我们可以通过扫描程序知道标识符是否已用过。 如果一个语句中把它当整数,而在另一个语句中把它当数组,对这种不一致的用法就应该报错。 另一方面,如果这个变量标识符总是用非整数,那么我们不仅能确信它的一致用法,而且在处理过程中也推断出它的类型一定是什么。 类型推断的例子 对于缺少完整的类型信息: type link = ↑cell; procedure mlist(lptr:link; procedure p); begin while lptr nil do begin p(lptr); lptr:=lptr↑.next end end; 可以推断出p的类型: link→void 类型推断的例子(2) 推断多态函数deref的类型 function deref(p); begin return p↑ end; 推断过程如下: 当推理到第一行时,我们不知道p的类型,用类型变量β来表示。 由第四行可知,β=pointer(α) deref:对于任意类型α, pointer(α)→ α α. pointer(α)→α 一个带有多态函数的语言 P→D;E D→D ;D | id: Q Q→∨type-variable. T | T T→T ‘→’ T | T × T | unary-constructor(T) | |basic-type | type-variable | (T) E→E(E) | E,E | id 这个文法产生的程序如下所示: deref : ∨α.pointer(α) → α; q: pointer(pointer(integer)); deref(deref(q)) 多态函数检查规则 同一个表达式中多态函数的不同出现不一定具有相同类型的参数 既然变量可以出现在类型表达式中,那么就必须要考虑类型的等价问题。 我们需要一种机制,记录对两个表达式进行一致化的
文档评论(0)