《编译原理》第6章 类型检查.ppt

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《编译原理》第6章 类型检查

?? 语义分析程序首先处理类型说明,建立类型 表达式,然后处理变量说明,建立变量和类型 表达式的绑定。具体实现是把变量标识符的类 型信息记录在其符号表的表项中,过程 addtype(id.entry,T.type)完成这个任务,其 翻译模式由图6-4给出 ?P→D;E ???D→D;D ???D→id:T??{addtype(id.enery,T.TYPE)} ???T→char??{T.type:=char} ???T→integer? {T.type:=integer} ???T→↑T1 ?{T.type:=POINTER(T1.type)} ???T→ARRAY[num] OF T1 ? {T.type:=ARRAY(num.val,T1.type)} ??图6-4 建立变量标识符和类型属性绑定 的翻译模式 6.2.2 类型检查 类型检查可以分为动态和静态两种。 动态检查在运行时刻完成。功效很低。但是如果语言允许动态确定类型,动态检查是必须的。 静态检查在编译时刻完成。静态检查是高效的。 如果一个语言能够保证经过静态检查之后,程序没有运行时刻的类型错误,则称为强类型的。 类型检查的内容包括: 表达式 语句 函数 ??? ?检查运算对象之间的类型是否满足相容条件,函数lookup(e)取符号表中保存在条目e中的类型。?? E→num ?? {E.type:=integer} ??? E→id ? ?{E.type:=lookup(id.entry)} ??? E→E1 MOD E2 ??{E.type:= IF (E1.type=integer)AND(E2.type=integer) ??? ????????THEN integer ELSE type_error} ?? E→E1[E2] ??{E.type:= IF(E2.type=integer)AND(E1.type=ARRAY(s,t)) ??? ? THEN t ELSE type_error } ?? E→E1↑?? {E.type:=IF E1.type=POINTER(t) ??? ???????????????????THEN t ELSE type_error} ??? 表达式的类型检查的翻译模式? ?表达式的类型检查 语句的类型检查主要包括:赋值语句类型的相容性,控制表达式的结果类型检查。 指派给语句的类型是基本类型void,如果在语句中发现类型错误, 指派给语句的类型是type_error。 语句的类型检查 ???S→id:=E {S.type:=IF id.type=E.type ??? ?????????????????????THEN void ELSE type_error} ???S→IF E THEN S1 {S.type:=IF E.type=boolean ??? ????????????????????THEN S1.type ELSE type_error} ??S→WHILE E DO S1 {S.type:=IF E.type=boolean ??? ?????????????????????THEN S1.type ELSE type_error} ??S→S1;S2 {S.type:=IF (S1.type=void)AND(S2.type=void) ??? ??????????????? THEN void ?ELSE type_error} ??? ?????图6-5检查语句类型的翻译模式 ??? 对说明部分的分析,应该能知道被引用函数 的类型。翻译模式为: ??T→T1‘ →’T2 {T.type:=T1.type→T2.type} ??? 函数引用可看成一个表达式作用于另一个表 达式,它的类型检查是: ??E→E1(E2) {E.type:=IF (E2.type=s)AND(E1.type=s→t) ??? ???????????????THEN t ELSE type_error } ??? ??把单个参数推广到多个参数,类型为 T1、T2、…、Tn的n个变元可以看成类型 为T1?T2 ? … ? Tn的一个变元。 函数引用的类型检查 ??6.2.2 类型转换 一般的程序设计语言中都规定了某些类型之间的转换关系:比如说整数量可以被当作实数量参与运算,并

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档