北航编译原理课件-10.语义分析和代码生成.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《北航编译原理课件-10.语义分析和代码生成.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 编译 原理 课件 10. 语义 分析 代码 生成
- 资源描述:
-
1、北京航空航天大学计算机学院北京航空航天大学计算机学院11第十章第十章 语义分析和代码生成语义分析和代码生成 语义分析的概念语义分析的概念 栈式抽象机及其汇编指令栈式抽象机及其汇编指令 声明的处理声明的处理 表达式的处理表达式的处理 赋值语句的处理赋值语句的处理 控制语句的处理控制语句的处理 过程调用和返回过程调用和返回北京航空航天大学计算机学院北京航空航天大学计算机学院22假定假定: 源语言:源语言: 通用的过程语言通用的过程语言 生成代码:生成代码:栈式抽象机的(伪)汇编程序栈式抽象机的(伪)汇编程序 翻译方法:翻译方法:自顶向下的属性翻译自顶向下的属性翻译 语法成分翻译子程序参数设置:语法
2、成分翻译子程序参数设置:继承属性为值形参继承属性为值形参综合属性为变量形参综合属性为变量形参 语法成分翻译动作子程序参数设置:语法成分翻译动作子程序参数设置:继承属性为值形参继承属性为值形参综合属性不设形参,而作为动作子程序的返回值综合属性不设形参,而作为动作子程序的返回值(由(由RETURNRETURN语句返回)语句返回)北京航空航天大学计算机学院北京航空航天大学计算机学院3310.1 语义分析的概念语义分析的概念1 1、上下文有关分析:、上下文有关分析:即标识符的作用域即标识符的作用域2 2、类型的一致性检查、类型的一致性检查3 3、语义处理:、语义处理: 声明语句:声明语句:其语义是声明
3、变量的类型等,并不要求其语义是声明变量的类型等,并不要求 做其他的操作。做其他的操作。 编译程序的工作是填符号表,登录名字编译程序的工作是填符号表,登录名字 的特征信息,分配存储。的特征信息,分配存储。 执行语句:执行语句:语义是要做某种操作。语义是要做某种操作。 语义处理的任务:按某种操作的目标结构语义处理的任务:按某种操作的目标结构 生成代码。生成代码。北京航空航天大学计算机学院北京航空航天大学计算机学院44 用上下文无关文法只能描述语言的语法结构,用上下文无关文法只能描述语言的语法结构,而不能描述其语义。而不能描述其语义。例如,对于有嵌套子程序结构的程序段:例如,对于有嵌套子程序结构的程
4、序段:BEGIN BEGIN INT I I END I END若存在文法规则:若存在文法规则:VAR := I BEGIN I . END BEGIN VAR . END V*且不包含变量且不包含变量I的声明的声明文法规则应改为:文法规则应改为:INT I VAR := INT I I第一次第一次I的归约正确的归约正确第二次第二次I的归约错误的归约错误北京航空航天大学计算机学院北京航空航天大学计算机学院55 然而上下文有关文法不仅构造困难,然而上下文有关文法不仅构造困难,而且其分析器十分复杂,分析效率又低,而且其分析器十分复杂,分析效率又低,显然是不实用的显然是不实用的 因此,通常我们把与语
5、义相关的上下文有关因此,通常我们把与语义相关的上下文有关信息填入符号表中,并通过查符号表中的这些信信息填入符号表中,并通过查符号表中的这些信息来分析程序的语义是否正确息来分析程序的语义是否正确北京航空航天大学计算机学院北京航空航天大学计算机学院6610.2 栈式抽象机及其汇编指令栈式抽象机及其汇编指令栈式抽象机:由三个存储器、一个指令寄存器栈式抽象机:由三个存储器、一个指令寄存器和多个地址寄存器组成。和多个地址寄存器组成。存储器:存储器: 数据存储器数据存储器 (存放(存放AR的的运行栈运行栈) 操作存储器操作存储器 (操作数栈操作数栈) 指令存储器指令存储器北京航空航天大学计算机学院北京航空
6、航天大学计算机学院77计算机的存储大致情况如下:计算机的存储大致情况如下:Pcode指令指令PC程序指令存储器程序指令存储器栈底栈底运行栈运行栈堆堆(堆底)NPSPBP当前模块活动当前模块活动记录记录(数据段数据段)北京航空航天大学计算机学院北京航空航天大学计算机学院88指令名称指令名称操作码操作码地址地址指令意义指令意义加载指令加载指令LODD将将 D 的内容的内容栈顶栈顶立即加载立即加载LDC常量常量常量常量栈顶栈顶地址加载地址加载LDA(D)变量变量 D 的地址的地址栈顶栈顶存储存储STOD栈顶内容栈顶内容 变量变量D D间接存间接存STD将栈顶内容将栈顶内容D 所指单元所指单元间接存间
7、接存STN将栈顶内容将栈顶内容次栈顶所指单元次栈顶所指单元加加ADD栈顶和次栈顶内容相加,结果留栈顶栈顶和次栈顶内容相加,结果留栈顶减减SUB次栈顶内容减栈顶内容次栈顶内容减栈顶内容乘乘MUL存入存入栈式抽象机指令代码如下:栈式抽象机指令代码如下:北京航空航天大学计算机学院北京航空航天大学计算机学院99指令名称指令名称操作码操作码地址地址指令意义指令意义等于比较等于比较EQL不等比较不等比较NEQ大于比较大于比较GRT次栈顶内容与栈顶内容比较,次栈顶内容与栈顶内容比较,结果结果(1 或或 0)留栈顶)留栈顶小于比较小于比较LES大于等于大于等于GTE小于等于小于等于LSE逻辑与逻辑与AND逻辑
8、或逻辑或ORL逻辑非逻辑非NOT转子转子JSRlab分配分配ALCM在运行栈顶分配大小为在运行栈顶分配大小为M的活动记录区的活动记录区北京航空航天大学计算机学院北京航空航天大学计算机学院101010.3 声明的处理声明的处理语义的表示:语义的表示:给出语言结构的属性翻译文法来说明其语义及语义动作给出语言结构的属性翻译文法来说明其语义及语义动作,并把这些语义动作插入属性翻译文法产生式中的适当位置。并把这些语义动作插入属性翻译文法产生式中的适当位置。 编译程序编译程序处理声明语句处理声明语句要完成的主要任务为:要完成的主要任务为:编译程序的任务:编译程序的任务:1) 分离出每一个被声明的实体,并把
9、它们的名字填入符号表中分离出每一个被声明的实体,并把它们的名字填入符号表中2) 把被声明实体的有关特性信息尽可能多地填入符号表中把被声明实体的有关特性信息尽可能多地填入符号表中 对于已声明的实体,在对于已声明的实体,在处理对该实体的引用处理对该实体的引用时要做的事情:时要做的事情:1) 检查对所声明的实体引用(种类,类型等)是否正确检查对所声明的实体引用(种类,类型等)是否正确2) 根据实体的特征信息,例如类型,所分配的目标代码地址(可能根据实体的特征信息,例如类型,所分配的目标代码地址(可能为数据区单元地址,或目标程序入口地址)生成相应的目标代码为数据区单元地址,或目标程序入口地址)生成相应
10、的目标代码北京航空航天大学计算机学院北京航空航天大学计算机学院1111声明的两种方式:声明的两种方式: (1) (1) 类型说明符放在变量的前面。如:类型说明符放在变量的前面。如:C C语言:语言: int a;int a; 在填表时已知类型和在填表时已知类型和a a的值(名字):直接填入符号表。的值(名字):直接填入符号表。 (2) (2) 类型说明符放在变量的后面,如:类型说明符放在变量的后面,如:Pascal, PL/1Pascal, PL/1,AdaAda 等,需要返填。等,需要返填。 声明有常量声明,变量(包括简单变量,数组变量声明有常量声明,变量(包括简单变量,数组变量和记录变量等
11、)和过程(函数和记录变量等)和过程(函数)声明等,这里主要讨论声明等,这里主要讨论常量声明和简单变量、数组声明的处理。常量声明和简单变量、数组声明的处理。如PL/I声明语句:DECLARE( X, Y(N), YTOTAL) FLOAT;北京航空航天大学计算机学院北京航空航天大学计算机学院1212声明语句的输入文法为:声明语句的输入文法为:DECLARE dec_onx ( ) t fix_upx, t n name_defn n| n , name_defn n tFIXED t | FLOAT t | CHAR tDECLARE () | , FIXED | FLOAT | CHAR 属性
12、翻译文法为:属性翻译文法为:北京航空航天大学计算机学院北京航空航天大学计算机学院1313name_defn n是将由各实体名所得的是将由各实体名所得的n继承属性值,依次填继承属性值,依次填入从入从x开始的符号表中。开始的符号表中。注:显然应有内部计数器或内部指针,指向下一个该填的符号表项。注:显然应有内部计数器或内部指针,指向下一个该填的符号表项。fix_upx, t 是将类型信息是将类型信息t 和相应的数据存储区分配地址填入和相应的数据存储区分配地址填入从从 x 位置开始的符号表中。(反填)位置开始的符号表中。(反填)当然,如果声明语句中,类型说明符放在头上,就无需当然,如果声明语句中,类型
13、说明符放在头上,就无需“反填反填”处理了。处理了。动作程序动作程序dec_onx 是把符号表当前可用表项的入口地址(指向符是把符号表当前可用表项的入口地址(指向符号表入口的指针,或称号表入口的指针,或称 表项下标值)赋给属性变量表项下标值)赋给属性变量x 。北京航空航天大学计算机学院北京航空航天大学计算机学院141410.3.1 常量类型声明处理常量类型声明处理常量标识符通常被看作是全局名。常量标识符通常被看作是全局名。常量声明的常量声明的ATG如下:如下: constant t n :=c, sinsert t,n,c,s ; t real t |integer t |string t c,
14、 s c, s |c, s |c, s 由该文法产生的一个声明实例为:由该文法产生的一个声明实例为: constant integer SYMBSIZE := 1024;北京航空航天大学计算机学院北京航空航天大学计算机学院1515翻译处理过程为:翻译处理过程为: 先识别类型(先识别类型(integer),将它赋给属性),将它赋给属性t;然后识别常量名字;然后识别常量名字(SYMBSIZE), 将它赋给属性将它赋给属性n;最后识别常量表达式,并将;最后识别常量表达式,并将其值赋给其值赋给c,其类型赋给属性,其类型赋给属性s 。 insert 的功能是:的功能是: 检查声明的类型检查声明的类型t
15、和常量表达式的类型和常量表达式的类型s 是否一致,若是否一致,若 不一致,则输出错误信息不一致,则输出错误信息 把名字把名字n,类型,类型t 和常量表达式的值和常量表达式的值c 填入符号表中填入符号表中 constant t n :=c, s insert t,n,c,s ;北京航空航天大学计算机学院北京航空航天大学计算机学院161610.3.2 简单变量声明处理简单变量声明处理ATG文法:文法: t , i n svardef t, i, n allocsvi ; t, i real t, i |integer t, i |character t ()i| logical t, i 简单变量
16、声明的例子:简单变量声明的例子: real x ; integer j; character ( 20 ) s ; n: 变量名 t: 类型值 i: 该类型变量所需 数据空间的大小北京航空航天大学计算机学院北京航空航天大学计算机学院1717procedure svardef( t, i, n ); j := tableinsert ( n, t, i ); /*将有关信息填入符号表将有关信息填入符号表*/ if j = 0 /填表时要检查是否重名填表时要检查是否重名 then errmsg ( duplident , statementno); else if j = -1 /符号表已满符号表
17、已满 then errmsg( tblovflow, statementno);end svardef;procedure allocsv( i ); codeptr := codeptr + i ; /codeptr 为分配地址指针为分配地址指针end allocsv;allocsv 和和 svardef 可以合并可以合并svardef动作符号是把动作符号是把n,i 和和t 填入符号表中。填入符号表中。北京航空航天大学计算机学院北京航空航天大学计算机学院1818 对于变长字符串(或其它大小可变的数据实体),往往需要对于变长字符串(或其它大小可变的数据实体),往往需要采用动态申请存储空间的办法
18、把可变长实体存储在堆中。我们可采用动态申请存储空间的办法把可变长实体存储在堆中。我们可通过指向存放该实体数据区的指针来引用该实体,有时还应得到通过指向存放该实体数据区的指针来引用该实体,有时还应得到该实体存储空间的大小信息,并一起填入符号表内。该实体存储空间的大小信息,并一起填入符号表内。10.3.3 数组变量声明的处理数组变量声明的处理 对于对于静态数组静态数组,即数组的大小在编译时是已知的,编译程序,即数组的大小在编译时是已知的,编译程序在处理数组声明时,可建立一个在处理数组声明时,可建立一个数组模板数组模板(又称为又称为数组信息向量数组信息向量)以便以后的程序中引用该数组元素时,可按照该
19、模板提供的信以便以后的程序中引用该数组元素时,可按照该模板提供的信息,息,计算数组元素计算数组元素(下标变量)的存储地址下标变量)的存储地址。 对于动态数组,其大小只有在运行时才能最后确定。我们对于动态数组,其大小只有在运行时才能最后确定。我们在编译时仅为该模板分配一个空间,而模板本身的内容将在运在编译时仅为该模板分配一个空间,而模板本身的内容将在运行时才能填入。行时才能填入。 北京航空航天大学计算机学院北京航空航天大学计算机学院1919 大部分程序设计语言,数组元素是按行(优先)存放在存储器大部分程序设计语言,数组元素是按行(优先)存放在存储器中的中的*,如声明数组,如声明数组array B
20、 ( N, -2: 1 )char ; -2 -1 0 1 1 2 3 N B:* FORTRAN 例外,例外,它按列(优先)存放数组元素它按列(优先)存放数组元素实际数组实际数组B各元素的存储次序为:各元素的存储次序为:LOC是数组首地址是数组首地址(该数组第一个元素的地址)该数组第一个元素的地址)B(1,-2)B(1,-1)B(1,0)B(1,1)B(2,-2)B(2,-1).B(N,1)LOC北京航空航天大学计算机学院北京航空航天大学计算机学院2020a)n维数组的地址计算公式维数组的地址计算公式 设数组的维数为设数组的维数为n, 各维的下界和上界为各维的下界和上界为L(i)和)和U(i
21、) 例如,例如, 上例二维数组上例二维数组B L(1) = 1 (隐含值)隐含值), U(1) = N L(2) = -2 , U(2) = 1 还假定还假定n维数组元素的下标为维数组元素的下标为V(1), V(2), V(n)则该数组元素的地址计算公式为:则该数组元素的地址计算公式为: niEiPiLiVLOCADR1)()()(其中其中P(i) = 1 当当i n时时 nijjLjU1 1)()(当当1 i n 时时注:注:E为数组元素为数组元素 大小(字节数)大小(字节数)北京航空航天大学计算机学院北京航空航天大学计算机学院2121 niEiPiLiVLOCADR1)()()(其中其中P
22、(i) = 1 当当i n时时 nijjLjU1 1)()(当当1 i n 时时U(2)L(2)L(1)U(1)U(3)L(3)v2v3v1A(v1,v2,v3) V(1)-L(1) *U(2)-L(2)+1*U(3)-L(3)+1*E+ V(2)-L(2) *U(3)-L(3)+1*E+ V(3)-L(3) *1*EP(2)P(3)P(1)北京航空航天大学计算机学院北京航空航天大学计算机学院2222若令若令 niEiPiLRC1)()(不变部分不变部分)则地址则地址 niEiPiVRCLOCADR1)()( RC为数组元素地址计算公式中的不变部分。因为,只要知道为数组元素地址计算公式中的不变
23、部分。因为,只要知道数组的维数和每一维的上下界值,便可求得数组的维数和每一维的上下界值,便可求得RC值。值。以前面所举的二维数组以前面所举的二维数组B为例,若为例,若N = 3则则 P(1) = U(2) - L(2) +1 = 1- (-2)+1 = 4P(2) = 1RC = 21*)()(iEiPiL= - 14 (-2)1E= -2E因此,因此, 若有数组元素若有数组元素B( 2 , 1 ), 则它的地址为:则它的地址为:EipiVELOCADRi 21)()(2 = LOC 2E+(24+11)ELOC + 7E北京航空航天大学计算机学院北京航空航天大学计算机学院2323U(2)L(
24、2)L(1)U(1)U(3)L(3)v2v3v1A(v1,v2,v3)三维数组的例子三维数组的例子数组模板的一般形式如数组模板的一般形式如下左图所示,而对于数组下左图所示,而对于数组B的模板如下右图所示:的模板如下右图所示:1-213142-2U(n)L(n)P(n)U(1)L(1)P(1)nRC.数组信息向量表数组信息向量表array B (3, -2: 1 ) char ;北京航空航天大学计算机学院北京航空航天大学计算机学院2424b) 数组信息向量表(模板)数组信息向量表(模板)功能:功能:1、用于计算下标变量地址、用于计算下标变量地址 2、检查下标是否越界、检查下标是否越界U(n)L(
25、n)P(n).U(1)L(1)P(1)nRC上界上界下界下界计算地址用计算地址用常量常量 大小:大小:3n + 23n + 2注:注:1 1、数组模板所需的空间、数组模板所需的空间大小取决于数组的维数大小取决于数组的维数,即,即3n+23n+2 无论是常界或变界数组,在编译时就能确定数组模板的大小无论是常界或变界数组,在编译时就能确定数组模板的大小 2 2、常界常界数组,在数组,在编译时就可造信息向量表编译时就可造信息向量表;而;而变界数组变界数组信息向量信息向量表要在目标程序运行时才能造。编译程序要表要在目标程序运行时才能造。编译程序要生成相应生成相应的指令的指令一般形式:一般形式:北京航空
展开阅读全文