编译原理第16讲(第八章).ppt
《编译原理第16讲(第八章).ppt》由会员分享,可在线阅读,更多相关《编译原理第16讲(第八章).ppt(38页珍藏版)》请在三一办公上搜索。
1、第八章 语义分析,8.1 语义处理概述8.2 属性文法和语法制导翻译8.3 中间代码的形式8.4 中间代码生成(典型语句的翻译)8.4 符号表,源语言程序,中间代码,汇编代码,词法分析,语义分析,语法分析,中间代码生成,代码生成,在编译中的逻辑阶段,前端处理,后端处理,语义处理,8.1语义处理(语义分析和中间代码生成),源语言程序,汇编代码,词法分析,语义分析,语法分析,代码生成,前端处理,后端处理,语义处理,8.1语义处理(语义分析),语义处理的任务,静态语义检查静态语义:语法规则的良形式条件静态语义检查:审查静态语义动态语义处理动态语义:程序单元执行的操作动态语义处理:生成(中间/目标)代
2、码,语义处理的实现,属性文法:描述语义规则。语法制导翻译:在语法分析的同时,执行语义规则描述的动作:检查静态语义生成中间代码/目标代码,语义处理的环境:符号表,为语义分析提供类型、作用域等信息。为代码生成提供类型、作用域、存储类别、存储(相对)位置等信息。,归纳:语义分析(静态语义处理),(1)类型检查。验证程序中执行的每个操作是否遵守语言的类型系统的过程.,编译程序必须报告不符合类型系统的信息。(2)控制流检查。控制流语句必须使控制转移到合法的地方。例如,在C语言中break语句使控制跳离包括该语句的最小while、for或switch语句。如果不存在包括它的这样的语句,则就报错。(3)一致
3、性检查。在很多场合要求对象只能被定义一次。例如Pascal语言规定同一标识符在一个分程序中只能被说明一次,同一case语句的标号不能相同,枚举类型的元素不能重复出现等等。(4)相关名字检查。有时,同一名字必须出现两次或多次。例如,Ada 语言程序中,循环或程序块可以有一个名字,出现在这些结构的开头和结尾,编译程序必须检查这两个地方用的名字是相同的。(5)名字的作用域分析,归纳:语义分析(通俗说法),给你一段文字英文,已经完成语法分析,要你进行语义分析。(自然语言的语义分析)静态语义部分:该单词是否是词典中的单词,确定每个单词的具体含义(查字典),判断是否有不符合逻辑的含义(词与词之间是否搭配,
4、apple eats a boy)。动态语义部分:生成汉语翻译,对需要调整句子结构的进行调整等等。,类型检查程序的设计(可选),1.辨认语言中可用的类型2.辨认具有类型的语言结构3.辨认语言的语义规则基础 类型的基本概念,类型的基本概念(可选),数据类型的三要素:用于区别这种数据类型的数据对象的属性 这种类型数据对象可以具有的值 可以施用在这种类型的数据对象上的操作数据类型分为:基本(初等)数据类型:数值数据,逻辑数据,字符数据,指针类型等。复合数据类型:数组、结构、表、栈、树等。抽象数据类型:Ada的包(Package),C+的类(Class)等。,类型的等价关系和相容关系(可选),等价关系
5、如果在任何场合下,类型A和类型B的表达式都可以互相替代,则称类型A与类型B等价。相容关系如果在类型A的表达式出现的任何场合下,都可以用类型B的表达式替换,则称类型B相容于类型A。,声明和定义(可选),声明:程序通过声明语句把标识符的名称、类型和作用域等信息传递给编译器。声明语句本身传递名字和类型信息,声明语句的位置传递作用域信息。定义:变量、类的声明就是定义。函数可以先声明一个原型,在定义中再给出实现的代码。,强类型语言和弱类型语言(可选),强类型语言标识符必须先声明后才能使用。标识符的类型信息在编译时是已知的。例如:PASCAL,C弱类型语言标识符不声明就可以直接引用。标识符的类型信息在编译
6、时不能确定,在运行时推测得到。例如:Lisp,ML,运算符(函数)的重载与多态函数(可选),重载运算符(overloading operator)是指该符号有多个含义,但根据上下文可以确定唯一的运算。如是重载符号,在AB中,当A和B为整数、实数、复数或者矩阵时,运算符执行不同类型的运算.当出现重载运算符时,要确定它所表示的唯一的意义,即进行运算符识别并检查运算符的操作数。多态函数(过程)-函数(过程)允许参数的类型变化.多态函数(过程)的特点是,每次被调用时,传递过来的参数可以具有不同类型。,作用域分析(可选),分程序结构的作用域规则作用域分析的实现,作用域(可选),作用域类型:Global
7、scope在任何函数和类定义之外的区域。所声明的标识符具有全局作用域。Class scope特指类定义的作用域。所声明的类类型具有全局作用域。所声明的类成员具有类作用域。Function scope特指函数形参表中参数的作用域。所声明的函数具有全局作用域,或类作用域,或其它局部作用域。所声明的形参具有函数作用域。Local scope由定界符/begin end分隔,定义在过程(函数)体或其它局部作用域(分程序)内。所声明的标识符具有局部作用域。,分程序结构语言的作用域规则(可选),当前开放的作用域中的标识符才能够被访问;在同一作用域中,不允许声明同名的标识符;在不同的作用域中,内层声明的标识
8、符将遮蔽外层声明的同名标识符,使其变为不可见的。int a;chara;floata;a 引用char a;函数形参表中的变量在函数体中是可见的;int a;floatfunc(float a,float b)a引用float a;,分程序结构语言作用域举例(可选),(1)main()(2)int a;(3)(4)(5)bool a;(6)(7)(8)double a;(9)(10)a(14)(15)(16),scope 3,scope 2,scope 1,scope 1:(1)-(16)scope 2:(4)-(14)嵌套于scope 1中 scope 3:(7)-(10)嵌套于scope
9、2中 scope 4:(11)-(12)嵌套于scope 2中 a(int)在scope 1中可见;a(bool)在scope 2,4中可见;a(double)在scope 3中可见程序运行到第12行时:scope 4是当前作用域;scope 1,2,4是开放的作用域;scope 3是关闭的作用域。,scope 4,8.2属性文法和语法制导翻译,1、属性文法概述2、基于属性文法的处理方法3、S-属性文法和自下而上翻译4、L-属性文法在自下而上分析中实现以上也是在实际应用中比较流行的语义描述和语义处理的方法,语义形式化(语义建模),形式语义学(如指称语义学、公理语义学、操作语义学等)的研究已取得
10、了许多重大的进展文法模型-属性文法命令式或操作式模型-操作语义学应用式模型-指称语义学公理式模型-公理语义学,程序设计语言的语义,静态语义 是对程序约束的描述,这些约束无法通过抽象语法规则来妥善地描述,实质上就是语法规则的良形式条件,它可以分为类型规则和作用域/可见性规则两大类。如:类型相容性、变量先声明后引用、名称相关要求动态语义 程序单位描述的计算编译程序的语义处理工作 静态语义审查 执行动态语义(计算)生成代码.,8.2.1属性文法,通常就是高级语言代码,属性文法(attribute grammar)是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法V:有穷的属性集,每个属
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 16 第八
链接地址:https://www.31ppt.com/p-5665750.html