欢迎来到天天文库
浏览记录
ID:50337666
大小:443.50 KB
页数:59页
时间:2020-03-08
《编译原理 教学课件 作者 王生原 董渊 杨萍 张素琴 slide09.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、语义分析与中间代码生成第九讲语义分析和中间代码生成在编译程序中的逻辑位置语义分析与中间代码生成词法分析语法分析中间代码生成中间代码优化目标代码优化目标代码生成语义分析语义处理语义分析和中间代码生成的重要数据结构符号表(symboltables)名字信息建立后加入/更改符号表名字信息如:种类,类型,偏移地址,占用空间等需要获取名字信息时,查找符号表符号表的组织可以体现名字作用域规则(符号表的组织已在第五讲专门讨论)语义分析与中间代码生成语义分析中间代码生成语义分析与中间代码生成语义分析的主要工作语义分析静态语义检查编译期间所
2、进行的语义检查动态语义检查所生成的代码在运行期间进行的语义检查收集语义信息为语义检查收集程序的语义信息为代码生成等后续阶段收集程序的语义信息有些内容合并到“中间代码生成”部分讨论(如过程、数组声明的语义处理)静态语义检查代码生成前程序合法性检查的最后阶段静态类型检查(typechecks)检查每个操作是否遵守语言类型系统的定义名字的作用域(scope)分析建立名字的定义和使用之间联系控制流检查(flow-of-controlchecks)控制流语句必须使控制转移到合法的地方(如break语句必须有合法的语句包围它)唯一性检
3、查(uniquenesschecks)很多场合要求对象只能被定义一次(如枚举类型的元素不能重复出现)名字相关检查(name-relatedchecks)(如,一些名字可能被要求配对出现)……语义分析类型检查程序(typechecker)负责类型检查验证语言结构是否匹配上下文所期望的类型为相关阶段搜集及建立必要的类型信息实现某个类型系统(typesystem)静态类型检查编译期间进行的类型检查动态类型检查目标程序运行期间进行的类型检查类型检查语义分析类型表达式(typeexpressions)由基本类型,类型名字,类型变量,
4、及类型构造子(typeconstructor)归纳定义的表达式类型系统(typesystems)将类型表达式赋给程序各个部分的规则集合类型表达式和类型系统语义分析某个类型表达式集合(将用于示范类型检查程序的设计)归纳定义如下:基本类型bool,char,int,real,type_error和void是类型表达式(其中,type_error专用于类型检查时的出错提示;而void表示无值类型,可用于语句的类型检查)若T是类型表达式,则array(I,T)是类型表达式,表示元素类型是T,下标集合是I的数组类型(这里,I是一个整
5、数区间,如1..10)若T是类型表达式,则pointer(T)是类型表达式,表示指向类型为T的对象的指针类型类型表达式举例语义分析以下是定义某个简单语言的上下文无关文法(将用于本讲的设计示例)G[P]:一个简单语言PD;EDD;Did:TTbooleancharintegerrealarray[num]ofTTEtruefalseliteralnumnum.numidEopEEropEE[E]ESid:=EifEthenSwhileEthenSS;S语义分析语法制导的方法将
6、类型表达式作为属性值赋给程序各个部分设计恰当的翻译模式可实现相应语言的一个类型系统类型检查程序的设计语义分析语法制导的方法处理声明的翻译模式(保存标识符的类型)类型检查程序的设计PD;EDD1;D2Did:TTbooleanTcharTintegerTrealTarray[num]ofT1TT1{addtype(id.entry,T.type)}{T.type:=bool}{T.type:=char}{T.type:=int}{T.type:=real}{T.type:=array(1..num.val
7、,T1.type)}{T.type:=pointer(T1.type)}语义分析语法制导的方法表达式的类型检查类型检查程序的设计EtrueEfalseEliteralEnumEnum.numEidEE1opE2{E.type:=bool}{E.type:=bool}{E.type:=char}{E.type:=int}{E.type:=real}{E.type:=lookup_type(id.entry)}{E.type:=ifE1.type=realandE2.type=realthenrealelseif
8、E1.type=intandE2.type=intthenintelsetype_error}语义分析语法制导的方法表达式的类型检查(续)类型检查程序的设计EE1ropE2EE1[E2]EE1{E.type:=ifE1.type=realandE2.type=realthenboolelseif
此文档下载收益归作者所有