资源描述:
《编译原理类型检查.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第六章类型检查内容类型系统类型表达式的等价类型转换函数和运算符的重载多态函数一致化算法静态检查(staticchecking)类型检查(typecheck)操作对象必须与操作符匹配:函数名相加×控制流检查(flow-of-controlcheck)break必须退出while、for、switch…唯一性检查(uniquenesscheck)对象(变量、标号…)定义必须唯一名字关联检查(name-relatedcheck)相同名字在不同位置类型检查检查语法结构的类型与上下文匹配简单的类型检查两个类型的匹配代码生成要利用类型信息重载
2、,多态6.1类型系统语法结构、类型、将类型赋予语法结构+,-,*的两个运算数均为整数,结果为整数&的结果为指向操作对象的指针,若操作对象类型为T,结果类型为“指向T的指针”每个表达式都有一个相关联的类型类型是有结构的!——指针基本类型:语言内部支持类型结构类型:组合基本类型构成新类型6.1.1类型表达式typeexpression——用以表示语言结构的类型基本类型或用类型构造符组合基本类型基本类型:boolean,char,integer,real,type_error,void类型名类型表达式(续)类型构造符数组:T是类型表达式
3、,I为索引集合(整数范围),则array(I,T)是一个类型表达式,表示元素为类型T的数组类型intA[10];——array({0,…,9},integer)笛卡儿积:T1、T2为类型表达式,则T1×T2为类型表达式类型表达式(续)记录:与笛卡儿积的不同之处仅在于记录的域有名字。<域名,域类型>元组typedefstruct{intaddress;charlexeme[15];}row;rowtable[101];类型表达式为:record((address×integer)×(lexeme×array({0,…,15}
4、,char)))类型表达式(续)指针:T为类型表达式,则pointer(T)为类型表达式,表示“指向类型为T的对象的指针”类型row*p;——pointer(row)函数:数学上,一个集合“定义域”到另一个集合“值域”的映射。程序语言,定义域类型D到值域类型R的映射:DR。%运算符——(int×int)intint*f(chara,charb);——(char×char)pointer(integer)不考虑函数返回数组、函数类型的情况(integerinteger)(integerinteger)可使用类型表达式变量
5、图表示类型表达式(char×char)pointer(integer)6.1.2类型系统typesystem:规则的集合规则——将类型表达式赋予程序的不同部分类型检查程序:实现一个类型系统语法制导方式实现——嵌入语义规则6.1.2静态/动态检查静态——编译器进行动态——运行时进行可靠类型系统,强类型语言——编译器无type_error运行时无类型错误inta[10],i;b=a[i];——需动态检查安全领域也涉及类型检查(缓冲溢出问题)6.1.4错误恢复最低要求:报告类型错误位置错误处理应融入规则中错误修正比描述正确程序更
6、困难根据错误的程序、处理缺失信息,来推测正确类型在变量使用之前无需定义它类型变量可用来处理这种问题6.2一个简单的类型检查器6.2.1一种简单语言用综合属性type保存类型表达式PD;EDD;D
7、id:TTchar
8、integer
9、array[num]ofT
10、^TEliteral
11、num
12、id
13、EmodE
14、E[E]
15、E^基本类型:char、integer、type_error例CODESomeTypesExpressionskey:integer;array[256]ofchararray(1..256,char)ke
16、ymod1999^integerpointer(integer)翻译模式PD;E{}DD;D{}Did:T{addtype(id.entry,T.type)}Tchar{T.type=char}Tinteger{T.type=integer}Tarray[num]ofT{T.type=array(1..num.val,T.type)}T^T{T.type=pointer(T.type)}Did:T的规则在符号表保存标识符类型T.type由后几个产生式语义规则计算PD;E,D在E之前,保证在检查表达式类型之前类型
17、已经保存入符号表6.2.2表达式类型检查Eliteral{E.type=char}Enum{E.type=integer}Eid{E.type=lookup(id.entry)}EE1modE2{E.type=if(E1.type==int