北航编译原理课件-10.语义分析和代码生成.ppt

上传人(卖家):三亚风情 文档编号:2774683 上传时间:2022-05-25 格式:PPT 页数:52 大小:531KB
下载 相关 举报
北航编译原理课件-10.语义分析和代码生成.ppt_第1页
第1页 / 共52页
北航编译原理课件-10.语义分析和代码生成.ppt_第2页
第2页 / 共52页
北航编译原理课件-10.语义分析和代码生成.ppt_第3页
第3页 / 共52页
北航编译原理课件-10.语义分析和代码生成.ppt_第4页
第4页 / 共52页
北航编译原理课件-10.语义分析和代码生成.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

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、常界常界数组,在数组,在编译时就可造信息向量表编译时就可造信息向量表;而;而变界数组变界数组信息向量信息向量表要在目标程序运行时才能造。编译程序要表要在目标程序运行时才能造。编译程序要生成相应生成相应的指令的指令一般形式:一般形式:北京航空

26、航天大学计算机学院北京航空航天大学计算机学院25251-213142-2以前面所举的二维数组以前面所举的二维数组B为例,若为例,若N = 3 P(1) = U(2) - L(2) +1 = 1- (-2)+1 = 4P(2) = 1RC = 21)()(iiPiL= - 14 (-2)1= -2数组信息向量表数组信息向量表U(2)-上界上界L(2)-下界下界P(2)-计算地址常量计算地址常量U(1)-上界上界L(1)-下界下界P(1)-计算地址常量计算地址常量n-维数维数RC北京航空航天大学计算机学院北京航空航天大学计算机学院2626数组声明的数组声明的ATG文法:文法: array k in

27、itjn ( j ) t symbinsertj, n, t j dimen#j | , j dimen#j u banndsu| l : lowerbndl u upperbndu, l1) 动作程序动作程序 init 的功能为在分配给数组模板区中保留两个存的功能为在分配给数组模板区中保留两个存 储单元,用来放储单元,用来放 RC 和和 n, 并将维数计数器并将维数计数器 j 清清0。2) dimen# j : j := j + 1, 即统计维数即统计维数北京航空航天大学计算机学院北京航空航天大学计算机学院27271) init:p:= p+2; j := 0; /*维数计数器维数计数器*/

28、RCnP(1)L(1)U(1).P(n)L(n)U(n)运行栈指针运行栈指针p p活动活动记录记录数组数组信息表信息表北京航空航天大学计算机学院北京航空航天大学计算机学院2828实际实际P(i)计算公式可利用计算公式可利用 P(i) U(i+ 1) - L(i +1) +1P(i+1)4) lowerbnd 把把 l = L(i ) upperbnd 把把 u = U(i ), 并计算并计算 P(i )5) 最后的动作程序最后的动作程序symbinsert是把数组名是把数组名n,数组维数,数组维数 j 和数和数组组 元素类型元素类型 t 及数组标志及数组标志 k 填入符号表中填入符号表中 ;为

29、数组分配存储空;为数组分配存储空间间3) bannds将省略下界表达式情况的将省略下界表达式情况的u = U(i),但应把相应的但应把相应的L(i) 置成隐含值置成隐含值1, 然后计算然后计算P(i )注:由于注:由于P(i)的计算要依赖于的计算要依赖于P(i +1 ), 所以实际所以实际P(i)的值是反填的的值是反填的P(i) = 1 当当i n 时时 nijjLjU1 1)()(当当1 i n 时时北京航空航天大学计算机学院北京航空航天大学计算机学院29294) lowerbndl 生成将生成将 l = L(i ) 的代码的代码 upperbndu 生成生成 把把 u = U(i )的代码

30、的代码, 生成计算生成计算 P(i )的代码;)的代码; 生成将生成将P(i )的值送模板区的代码;)的值送模板区的代码;5) symbinsertj, n, t a) 把把n, j, t, 填入符号表中填入符号表中 b) 生成调用运行子程序代码(计算生成调用运行子程序代码(计算RC, 并将计算结果和数组并将计算结果和数组 名一起存入模板区;计算数组所需数据区大小,为数组分名一起存入模板区;计算数组所需数据区大小,为数组分配存储空间,并将头地址填入符号表。)配存储空间,并将头地址填入符号表。)对于变界数组对于变界数组:北京航空航天大学计算机学院北京航空航天大学计算机学院303010.4 表达式

31、的处理表达式的处理 分析表达式的主要目的是生成计算该表达式值的代码。通分析表达式的主要目的是生成计算该表达式值的代码。通常的做法是把表达式中的操作数装载(常的做法是把表达式中的操作数装载(LOAD)到)到操作数栈操作数栈(或运行栈)栈顶单元或某个寄存器中,然后执行表达式所指(或运行栈)栈顶单元或某个寄存器中,然后执行表达式所指定的操作,而操作的结果保留在栈顶或寄存器中。定的操作,而操作的结果保留在栈顶或寄存器中。 注:注:操作数栈操作数栈即即操作栈操作栈,它可以和前述的,它可以和前述的运行栈运行栈 (动态存储分配动态存储分配)合而为一,也可)合而为一,也可单独设栈单独设栈。本章中所指的本章中所

32、指的操作数栈操作数栈实际应实际应与动态运行(存储分配)栈分开与动态运行(存储分配)栈分开。请看下面的整型表达式请看下面的整型表达式ATG文法:文法:北京航空航天大学计算机学院北京航空航天大学计算机学院3131有关的语义动作为:有关的语义动作为:procedure add; emit(ADD);end;procedure push(j); integer j; emit(LOD, symbtbl (j).objaddr);end;procedure pushi(i); /*压入整数压入整数*/ integer i; emitl(LDC, i) ;end;1.2.3.4. | +add5. | -

33、 sub6.7. 8. | *mul9. | /div10.nlookupnj pushj11. | ipushii12. | ()procedure lookup(n); string n; integer j; j:= symblookup( n); /*名字名字n表项在符号表中的位置表项在符号表中的位置*/ if j 1 then /*error*/ else return (j);end;procedure mul; emit(MUL);end;北京航空航天大学计算机学院北京航空航天大学计算机学院3232对于输入表达式对于输入表达式 x + y * 3, 可以生成如下目标代码:可以生成

34、如下目标代码: LOD, x LOD, y LDC, 3 MUL ADD 上面所述的表达式处理实际上忽略了出现在表达式中各操上面所述的表达式处理实际上忽略了出现在表达式中各操作数类型的不同,且变量也仅限于简单变量。作数类型的不同,且变量也仅限于简单变量。 下面假定表达式中允许整型和实型混合运算,并允许在下面假定表达式中允许整型和实型混合运算,并允许在 表达式中出现下标变量(数组元素)。因此应该增加有关类表达式中出现下标变量(数组元素)。因此应该增加有关类型一致性检查和类型转换的语义动作,也要相应产生计算下型一致性检查和类型转换的语义动作,也要相应产生计算下标变量地址和取下标变量值的有关指令。标

35、变量地址和取下标变量值的有关指令。北京航空航天大学计算机学院北京航空航天大学计算机学院3333 t t s s t s u echo s u | + t add t, s v v u | - t sub t, s v v uu s s u s u echo s u | *t mul t, s v v u | /t div t, s v v uti typeit | i pushii t | r pushir tj n lookup n j push j | n lookup n j (template j k k, j) k, j t offset k, t i i, j k, j check

36、dim k, j | , t offset k, t i i, j t t 北京航空航天大学计算机学院北京航空航天大学计算机学院3434语义动作语义动作add等应作相应改变:等应作相应改变:procedure add( t, s); string t, s; if t = real and s = integer then begin emit( CVN); /*次栈顶转为实数次栈顶转为实数*/ emit( ADD); return ( real); end; if t = integer and s = real then begin emit( CNV); /*栈顶转为实数栈顶转为实数*/

37、 emit( ADD); return ( real); end; emit( ADD); return ( t);end;procedure template(j); integer j; emitl( TMP, symbtbl (j). objaddr); k:= 0; /*维数计数器初始化维数计数器初始化*/ return(k);end;procedure offset( k, t ); integer k; string t; k := k+1; if t integer then errmsy(数组下标应为整数组下标应为整 型表达式型表达式, statno); else emitl(

38、 OFS, k ); return (k);end; procedure checkdim( k, j); integer k, j; if k symbtbl (j).dim then errmsy(数组维数与数组维数与 声明不匹配声明不匹配, statno); else begin emit( ARR); emit( DER); end;end; 北京航空航天大学计算机学院北京航空航天大学计算机学院3535过程过程template发送一条目标机指令发送一条目标机指令TMP, 该指令把数组的模该指令把数组的模板地址加载到操作数栈顶,并将下标(维数)计数器板地址加载到操作数栈顶,并将下标(维数

39、)计数器k清清0。 offset过程要确保每一个下标都是整型,而且发送一条过程要确保每一个下标都是整型,而且发送一条OFS指令,该指令在运行时要完成以下功能:指令,该指令在运行时要完成以下功能:1. 检查第检查第k个下标值是否在栈顶并是否在上下界范围内个下标值是否在栈顶并是否在上下界范围内2.使用下列递归函数,计算地址计算公式中可变部分:使用下列递归函数,计算地址计算公式中可变部分: VP(0) = 0; VP(k) = VP(k-1) + V(k) *P(k) 1kn该该VP函数是由计算公式函数是由计算公式 导出的导出的 nkkPkV1)()(北京航空航天大学计算机学院北京航空航天大学计算机

40、学院3636下面以数组元素下面以数组元素B(2,1)为例,说明为例,说明(a)执行)执行TMP指令并形成第一个下标值的情况指令并形成第一个下标值的情况(b)执行第一)执行第一 个个OFS指令并形成第二个下标值的情况指令并形成第二个下标值的情况(c)执行第二个)执行第二个OFS指令及指令及ARR指令后的情况指令后的情况 (d)执行)执行DER指令,最后在栈顶形成下标变量指令,最后在栈顶形成下标变量B(2,1)的值的值(a)B(2,1)值.数据栈数据栈(b)(c)(d)12*4=8locB.V(2)VP(1)栈底栈底18+1=9locB.V(2)VP(2)栈底栈底 LOC+(-2)+9 =LOC+

41、720locB.V(1)VP(0)栈底栈底操作数栈操作数栈1-213142-2.B的模板的模板U(2)L(2)P(2)U(1)L(1)P(1)#dimRClocB北京航空航天大学计算机学院北京航空航天大学计算机学院3737 处理逻辑表达式处理逻辑表达式(关系表达式)的方法与处理算术表达式关系表达式)的方法与处理算术表达式的方式基本相同。下面是逻辑表达式的方式基本相同。下面是逻辑表达式( x =y & yz | z x) 生成的指令序列:生成的指令序列:LOD, ( ll, on )xLOD, ( ll, on )yEQLLOD, ( ll, on )yLOD, (ll, on )zNEQAND

42、LOD, ( ll, on )zLOD, ( ll, on )xLESORLNOT北京航空航天大学计算机学院北京航空航天大学计算机学院383810.5 赋值语句的处理赋值语句的处理X:= Y+X;setL LLt:= resetLLsstorint,s ;procedure setL; return (true );end;指示取变量地址指示取变量地址LDA ( ll, on )xLOD ( ll, on )yLOD ( ll, on )xADDSTNsetL是设置变量为是设置变量为“左值左值”(被赋变量),即将属性(被赋变量),即将属性L置置trueresetL是设置变量为非被赋变量,即把属

43、性是设置变量为非被赋变量,即把属性L置成置成falseprocedure resetL; return (false );end;指示取变量之值指示取变量之值procedure storin(t,s); string t, s; if t s then /*生成进行类型转换的指令生成进行类型转换的指令*/ emit(STN);end;北京航空航天大学计算机学院北京航空航天大学计算机学院393910.6 控制语句的处理控制语句的处理IF THEN labA:IF THEN ELSE labA: labB: 10.6.1 if语句语句JMF, labAJMF, labAJMP, labB其属性翻译

44、文法及相应的语义动作程序其属性翻译文法及相应的语义动作程序:1. y y2. yIF brfy THEN 3. ylabprody |ELSE brzlabprodylabprodz北京航空航天大学计算机学院北京航空航天大学计算机学院4040 动作程序动作程序brf的功能是生成的功能是生成JMF指令,并将转移标号返回给属性指令,并将转移标号返回给属性yprocedure brf; string labx; labx := genlab; /*产生一标号赋给产生一标号赋给labx*/ emitl(JMF, labx); return (labx);end; 动作程序动作程序labprod是把从继

45、承属是把从继承属性性y得到的标号设置到目标程序中得到的标号设置到目标程序中procedure labprod(y); string y; setlab(y);/*在目标程序当前位置设标号在目标程序当前位置设标号*/end; 动作程序动作程序br是是是生成是生成JMP指指令,并将转移标号返回给属性令,并将转移标号返回给属性zprocedure br; string labz; labz := genlab; emitl( JMP, labz); return( labz); end;北京航空航天大学计算机学院北京航空航天大学计算机学院414110.6.4 for 循环语句循环语句for 语句例子

46、:语句例子: for i:= 1 to n by z do . end for;ATG文法文法1.a, f, r a, f, r2.a, f, r for a := initloads to labgenr by loadida comparea, sf3.a, f, r do end for retbranchr labemitfinitload 只生成给循环变量赋初值的指令。只生成给循环变量赋初值的指令。北京航空航天大学计算机学院北京航空航天大学计算机学院4242for := to by do LDA, ()LOD, (expr1) loop: start: JMP, loop end_

47、loop:LOD, (expr2) LOD, (id) LOD, (expr3)STNJMP, start BGT, end_loop ADD STO, (id)initloadslabgenrcomparea, sfretbranchrlabprodfloadida北京航空航天大学计算机学院北京航空航天大学计算机学院4343procedure labgen string r; r := genlab; setlab(r); return ( r );end;procedure compare( a, s); address a; string f, s; emit( ADD); emitl(

48、 STO, a ); f := genlab; emitl( BGT, f ); setlab( s ); return( f );end;procedure labprod( f ) / 即即labemit string f; setlab( f );end;procedure loadid( a ) address a; emitl( LOD, a);end;北京航空航天大学计算机学院北京航空航天大学计算机学院444410.7 过程调用和返回过程调用和返回 实现:实现: 调用段(过程语句的目标程序段):调用段(过程语句的目标程序段): 计算实参计算实参值值 = 操作数栈栈顶操作数栈栈顶 被

49、调用段(过程说明的目标程序段):被调用段(过程说明的目标程序段): 从栈顶取得从栈顶取得值值 = 形参单元形参单元10.7.1 参数传递的基本形式参数传递的基本形式如如C语言,语言,Ada语言的语言的in参数参数, Pascal 的值参数。的值参数。1.传值(传值(call by value) 值调用值调用过程体中对形参的处理:过程体中对形参的处理: 对形参的访问等于对相应实参的访问对形参的访问等于对相应实参的访问特点特点: 数据传递是单向的数据传递是单向的北京航空航天大学计算机学院北京航空航天大学计算机学院45452.传地址(传地址(call by reference) 引用调用引用调用 实

50、现:实现: 调用段:调用段: 计算实参计算实参地址地址 = 操作数栈栈顶操作数栈栈顶 被调用段:被调用段: 从栈顶取得从栈顶取得地址地址 = 形参单元形参单元 过程体中对形参的处理:过程体中对形参的处理: 通过对形参的通过对形参的间接访问间接访问来访问相应的实参来访问相应的实参 特点特点: 结果随时送回调用段结果随时送回调用段 如:如:FORTRAN, Pascal 的变量形参。的变量形参。如:如:ALGOL 的的换名形参。换名形参。3. 传名(传名(call by name ) 又称又称“名字调用名字调用”。即把实参名字传给形参。这样在过程体中引用形参。即把实参名字传给形参。这样在过程体中引

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(北航编译原理课件-10.语义分析和代码生成.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|