欢迎来到天天文库
浏览记录
ID:59051840
大小:664.50 KB
页数:58页
时间:2020-10-29
《第七章语义分析和中间代码产生.ppt》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第七章语义分析和中间代码产生7.1语义分析7.2逆波兰表示法7.3三元式7.4四元式7.5简单表达式和赋值语句到四元式的翻译7.6布尔式到四元式的翻译7.7控制语句的翻译7.1语义分析语义分析属性文法和语法制导翻译方法和技术应用于语义分析中。语义分析通常包括以下几个方面:9/10/20212中南大学软件学院陈志刚(1)类型检查。验证程序中执行的每个操作是否遵守语言的类型系统的过程.,编译程序必须报告不符合类型系统的信息。(2)控制流检查。控制流语句必须使控制转移到合法的地方。例如,在C语言中break语句使控制跳离包括该语句的最小while、for或switch语句。如果不存
2、在包括它的这样的语句,则就报错。(3)一致性检查。在很多场合要求对象只能被定义一次。例如Pascal语言规定同一标识符在一个分程序中只能被说明一次,同一case语句的标号不能相同,枚举类型的元素不能重复出现等等。(4)相关名字检查。有时,同一名字必须出现两次或多次。例如,Ada语言程序中,循环或程序块可以有一个名字,出现在这些结构的开头和结尾,编译程序必须检查这两个地方用的名字是相同的。(5)名字的作用域分析9/10/20213中南大学软件学院陈志刚类型和声明(Typesanddeclarations)一个类型是一组值和在这些值上的一组操作,程序设计语言中有三种类型:基本类型
3、:int,float,double,char,bool等等.也可能允许在基本类型基础上用户自己定义的类型,如枚举型.复合类型:数组,指针,记录/结构/联合,类等等.这些类型由基本类型构成.复杂类型:链表,栈,队,树,堆,表格等等.可以把它们组织成ADT.一个语言不一定支持这类高级的抽象。声明是程序中的一个语句,是把数据对象的名称和类型,以及生命周期信息传给编译,声明的地方传递生命周期信息也有些语言允许声明初始化变量。如:doublecalculate(inta,doubleb);//functionprototypeintx=0;//globalvariablesavaila
4、blethroughoutdoubley;//theprogramintmain(){intm[3];//localvariablesavailableonlyinmainchar*n;...}9/10/20214中南大学软件学院陈志刚强类型的-任何数据类型都可以在编译时确定弱类型的.进行类型检查的时间:编译时,运行时,或者两者结合.静态类型检查编译时进行类型检查动态类型检查,将类型信息并到运行时每个数据单元中.隐含类型转换.9/10/20215中南大学软件学院陈志刚P→D;ED→D;
5、id:TT→char
6、integer
7、aray[num]ofT
8、↑TE→literal
9、n
10、um
11、id
12、EmodE
13、E[E]
14、E↑P代表程序;D代表说明;E代表表达式。如程序语句:key:integer;keymod1999语言本身提供两种基本类型:char和integer。除此之外还有缺省的基本类型type_error和void。假定所有数组都从下标1开始9/10/20216中南大学软件学院陈志刚确定标识符类型的部分翻译模式(1)P→D;E(2)D→D;D(3)D→id:T{addtype(id.Entry,T.type)}(4)T→char{T.Type:=char}(5)T→integer{T.Type:=integer}(6)T→↑T1{T.Type:=po
15、inter(T1.type)}(7)T→array[num]ofT1{T.Type:=array(num.Val,T1.type)}9/10/20217中南大学软件学院陈志刚语句的类型检查的翻译模式S→id:=E{ifid.Type=E.TypeThenS.Type:=voidelseS.Type:=type_error}S→ifEthenS1{ifE.type=booleanthenS.Type:=S1.typeelseS.type:=type_error}S→whileEdoS1{ifE.type=booleanThenS.type:=S1.TypeelseS.type:
16、=type_error}9/10/20218中南大学软件学院陈志刚设计类型检查程序1.辨认语言中可用的类型2.辨认具有类型的语言结构3.辨认语言的语义规则9/10/20219中南大学软件学院陈志刚实现类型检查程序首先,将每个名字(标识符)的类型信息记录在符号表中9/10/202110中南大学软件学院陈志刚作用域检查作用域和可见性基本作用域规则(lexicalrule)inta;voidBinky(inta){inta;a=2;...}作用域检查实现:1每个作用域一个独立的符号表,这些符号表组织成作用域栈
此文档下载收益归作者所有