




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-3-81编译原理编译原理(Principles of Compiling)n主讲:周翰逊主讲:周翰逊nEmailEmail:nQQQQ:26054036260540362022-3-82上次课主要内容上次课主要内容语法制导翻译语法制导翻译 完成语法翻译的目的完成语法翻译的目的 实现高级语言源程序到目标语言程序的等价变化实现高级语言源程序到目标语言程序的等价变化 源语句的结构与目标代码结构的对应源语句的结构与目标代码结构的对应 做法做法 EE1 + E2E.val:=E1.val+E2.val 依据产生式设计语义处理子程序依据产生式设计语义处理子程序语法制导翻译语法制导翻译 一种实现一
2、种实现属性文法属性文法 A=(G, V, F) 用属性表示一些语义值用属性表示一些语义值2022-3-83上次课主要内容上次课主要内容属性计算与分类属性计算与分类 继承属性继承属性 AX1X2XnXi.in=f(c,c1,c2,ck) 1kinAx1x2xnxkXi.inc1c2ckcnc2022-3-84上次课主要内容上次课主要内容属性计算与分类属性计算与分类 综合属性综合属性 AX1X2Xn A.s=f(c1,c2,ck)Ax1x2xnA.sc1c2cnA.in固有属性是一种综合属性固有属性是一种综合属性2022-3-85上次课主要内容上次课主要内容 综合属性值综合属性值在归约时进行计算在
3、归约时进行计算 是其是其“后代后代”的综合结果,所以在处理完成后获得的综合结果,所以在处理完成后获得 继承属性值继承属性值在派生时进行计算在派生时进行计算 变量的继承属性用于该变量的相关处理,所以通常变量的继承属性用于该变量的相关处理,所以通常在处理此变量前完成计算在处理此变量前完成计算 固有属性值固有属性值单词属性(值)在词法分析时单词属性(值)在词法分析时完成完成2022-3-86上次课主要内容上次课主要内容S-属性定义属性定义 只含综合属性的属性文法,又称为只含综合属性的属性文法,又称为S-属属性文法性文法产生式产生式属性(计算)规则属性(计算)规则/语义规则语义规则E E1 + E2E
4、.val := E1.val + E2.valE E1 * E2E.val := E1.val * E2.valE (E1)E.val := E1.valE idE.val := id .val2022-3-87上次课主要内容上次课主要内容L-属性定义属性定义 包含综合属性和继承属性的属性文法,包含综合属性和继承属性的属性文法,又叫又叫L-属性文法属性文法D T LL.in := T.typeT intT.type := integerT realT.type := realL L1 ,idL1.in := L.inaddtype(id.entry, L.in)L idaddtype(id.e
5、ntry, L.in)2022-3-88上次课主要内容上次课主要内容翻译模式翻译模式 语义动作被嵌入到产生式右部的适当位置,在推语义动作被嵌入到产生式右部的适当位置,在推导过程中完成语义处理导过程中完成语义处理D T LT intT realL L1 , idL id2022-3-89第第7 7章章 语义分析和语义分析和中间代码生成中间代码生成2022-3-810 中间代码中间代码 赋值语句的翻译赋值语句的翻译 控制语句的翻译(控制语句的翻译(if if、循环)循环) 属性文法的实现属性文法的实现 说明语句翻译说明语句翻译 组合数据说明的翻译组合数据说明的翻译 过程调用翻译过程调用翻译2022
6、-3-811 作用作用 过渡:经过语义分析被译成中间代码序列过渡:经过语义分析被译成中间代码序列 形式形式 中间语言代码中间语言代码 优点优点 便于编译系统的实现、移植、代码优化便于编译系统的实现、移植、代码优化2022-3-812 三地址码(四元式)三地址码(四元式) 语法语法( (结构结构) )树(三元式)树(三元式) 抽象语法树抽象语法树 带注释的语法树带注释的语法树 后缀式后缀式逆波兰表示逆波兰表示 特点特点 形式简单、语义明确、便于翻译形式简单、语义明确、便于翻译 独立于目标语言独立于目标语言2022-3-813例例 7-1 7-1 表达式表达式 ( (A - 12) A - 12)
7、 * * B + 6 B + 6 的中间代码的中间代码三地址码三地址码T1=A-12T2=T1*BT3=T2+6四元式四元式(-, A, 12, T1)(* , T1, B, T2)(+, T2, 6, T3)三元式三元式1 (-, A, 12)2 (* , (1), B)3 (+, (2), 6)波兰表示波兰表示+*-A12B6逆波兰表示逆波兰表示A12-B*6+-+*6A12B语法结构树语法结构树抽象语法树抽象语法树2022-3-814 属性设置属性设置 E.p E.p 是语法结构树指针是语法结构树指针 id.entry id.entry 是名字的表项入口是名字的表项入口 num.val
8、num.val 是数值是数值 基本函数基本函数结点构造结点构造 mknode mknode 建中间结点建中间结点 mkleaf mkleaf 建叶结点建叶结点6A12-+B*C:=语法结构树语法结构树抽象语法树抽象语法树2022-3-815产生式产生式语义规则语义规则Sid:=EEE1+E2EE1*E2E -E1E (E1)E idE num S.p:= mknode(:=, mkleaf(id, id.entry), E.p)E.p:= mknode(+, E1.p, E2.p)E.p:= mknode(*, E1.p, E2.p)E.p:= mknode(-, 0, E1.p)E.p:=
9、E1.pE.p:= mkleaf(id, id.entry)E.p:=mkleaf(num,num.val)2022-3-816:=*-0+*-0idbnum 34idbidcidaroot2022-3-8179ida地址地址 算符算符 操作数操作数1 1 操作数操作数2 2以语法分析为中心以语法分析为中心S id:=E0idb1idc2-013*024idb5num346-057*468+3710 :=982022-3-818 二元运算:操作数二元运算:操作数 1 1,操作数,操作数 2 2,运算符,运算符 一元运算:操作数,运算符一元运算:操作数,运算符 例例 8-7 8-7: a :=
10、b a := b * *(- c- c)+ b + b * *(- 34- 34)的后缀式的后缀式 a b c - a b c - * * b 34 - b 34 - * * + := + :=2022-3-819产生式产生式语义规则语义规则Sid:=EEE1+E2EE1*E2E -E1E (E1)E idE num 注释:注释: | | 表示代码序列的连接表示代码序列的连接Print( | E.code | “:=”)E.code := E1.code | E2.code | ”+”E.code := E1.code | E2.code | ”*”E.code := E1.co
11、de | “-“E.code := E1.codeE.code := E.code := num.val; 2022-3-820一般形式一般形式 x := y op zx := y op z 其中其中 x, y, z x, y, z 为变量名、常数或编译产生的临时为变量名、常数或编译产生的临时变量变量 四元式(四元式(op, y, z, xop, y, z, x)2022-3-821 条件转移语句条件转移语句 goto lgoto l无条件转移无条件转移 param x param x 实在参数实在参数 call p, n call p, n 过程调用过程调用 return x
12、return x 过程返回过程返回 x := yix := yi数组运算数组运算 xi := yxi := yx := &yx := &y指针运算指针运算x := x := * *y y* *x = yx = y产生式产生式语义规则语义规则Sid:=EEE1+E2EE1*E2E -E1E (E1)E idE num 注:注: | 表示代码序列的连接表示代码序列的连接S.code:=E.code|gen(id.place:=E.place)E.place:=newtemp;E.code := E1.code| E2.code | gen(E.place:=E1.place+ E2
13、.place)E.place:=newtemp;E.code := E1.code | E2.code | gen(E.place:=E1.place* E2.place)E.place:=newtemp; E.code := E1.code | gen(E.place:=uminus E1.place)E.place:= E1.place; E.code := E1.codeE.place:= id.place; E.code := E.place:= num.val; E.code := 2022-3-823编译原理编译原理(Principles of Compiling)n主讲:周翰逊主
14、讲:周翰逊nEmailEmail:nQQQQ:26054036260540362022-3-824上次课主要内容上次课主要内容 三地址码(四元式)三地址码(四元式) 语法语法( (结构结构) )树(树(三元式三元式) 后缀式后缀式逆波兰表示逆波兰表示2022-3-825上次课主要内容上次课主要内容产生式产生式语义规则语义规则Sid:=ES.p:= mknode(:=, mkleaf(id, id.entry), E.p)EE1+E2E.p:= mknode(+, E1.p, E2.p)EE1*E2E.p:= mknode(*, E1.p, E2.p)E -E1E.p:= mknode(-, 0
15、, E1.p)E (E1)E.p:= E1.pE idE.p:= mkleaf(id, id.entry)E num E.p:=mkleaf(num,num.val) 2022-3-826上次课主要内容上次课主要内容产生式产生式语义规则语义规则Sid:=EPrint( | E.code | “:=”)EE1+E2E.code := E1.code | E2.code | “+”EE1*E2E.code := E1.code | E2.code | “*”E -E1E.code := E1.code | “-”E (E1)E.code := E1.codeE idE.code :=
16、 E num E.code := num.val; 2022-3-827上次课主要内容上次课主要内容 x := y op zx := y op z;四元式(四元式(op, y, z, xop, y, z, x)产生式产生式语义规则语义规则Sid:=ES.code:=E.code | gen(id.place:=E.place)EE1+E2E.place:=newtemp; E.code := E1.code | E2.code | gen(E.place:=E1.place+ E2.place)E idE.place:= id.place; E.code := E num E.p
17、lace:= num.val; E.code := 2022-3-828产生式产生式语义规则语义规则Sid:=EEE1+E2EE1*E2E -E1E (E1)E idE num 注:注: | | 表示代码序列的连接表示代码序列的连接Print( | E.code | “:=”)E.code := E1.code | E2.code | ”+”E.code := E1.code | E2.code | ”*”E.code := E1.code | “-“E.code := E1.codeE.code := E.code := num.val; 2022-3-829产生
18、式产生式语义规则语义规则Sid:=EEE1+E2EE1*E2E -E1E (E1)E idE num 注:注: | 表示代码序列的连接表示代码序列的连接S.code:=E.code|gen(id.place:=E.place)E.place:=newtemp; E.code := E1.code| E2.code | gen(E.place:=E1.place+ E2.place)E.place:=newtemp; E.code := E1.code | E2.code | gen(E.place:=E1.place* E2.place)E.place:=newtemp; E.code :=
19、E1.code | gen(E.place:=uminus E1.place)E.place:= E1.place; E.code := E1.codeE.place:= id.place; E.code := E.place:= num.val; E.code := 2022-3-830 作用作用 说明语句说明语句( (Declarations)Declarations)用于说明程序中规定用于说明程序中规定范围内使用的各类变量、常数和过程范围内使用的各类变量、常数和过程 需要完成的工作需要完成的工作 在符号表中记录被说明对象的属性,为执行在符号表中记录被说明对象的属性,为执行做准备做准备 计
20、算要占的存储空间,计算相对地址计算要占的存储空间,计算相对地址2022-3-831要关心的问题要关心的问题 类型类型 基本类型基本类型/ /内部类型(内部类型(built-in)built-in):整型、实型、整型、实型、双精度型、逻辑型、字符型双精度型、逻辑型、字符型 用户定义类型用户定义类型结构描述结构描述 作用域作用域有效范围有效范围 一般:说明所在的分程序、过程一般:说明所在的分程序、过程2022-3-832要关心的问题要关心的问题 类型的作用类型的作用 引入数据抽象、隐蔽数据的基本表示引入数据抽象、隐蔽数据的基本表示 用户无需注明字节数用户无需注明字节数 规定可用的运算规定可用的运算
21、 类型检查类型检查 数据精度控制数据精度控制 规定存储单元的字节数,优化空间管理规定存储单元的字节数,优化空间管理2022-3-833 在符号表中填写变量的属性在符号表中填写变量的属性 种别、类型、种别、类型、相对地址相对地址、作用域、作用域、等、等 相对地址与数据区的划分相对地址与数据区的划分 全局变量:静态数据区的偏移值全局变量:静态数据区的偏移值( (offset)offset) 局部变量:局部数据区局部变量:局部数据区( (活动记录部分)的偏移活动记录部分)的偏移值值( (offset)offset) 两种数据区:静态数据区、动态数据区两种数据区:静态数据区、动态数据区2022-3-8
22、340实型实型8 8字节,整型字节,整型4 4字节字节名字名字 相对地址相对地址x xi ij j856646806468ijX1X2X82022-3-835文法描述文法描述P DP DD D ; DD D ; DD id : TD id : TT integer T integer T realT realT arraynum of TT arraynum of T1 1 T T T T1 1例如:例如:a:integer; b:real;c:array10of realTTTDDDDPD2022-3-836 类型类型T T的属性的属性 type type 类型类型 width width
23、占用的字节数占用的字节数 基本子程序基本子程序 enterenter:设置变量的类型和地址设置变量的类型和地址 arrayarray:数组类型处理数组类型处理 全局量全局量 offsetoffset:已分配空间字节数已分配空间字节数2022-3-837P offset := 0 DP offset := 0 DDD ; DDD ; DDid : T enter( , T.type, offset ); Did : T enter( , T.type, offset ); offset := offset + T.width offset := offset + T.
24、widthTinteger T.type := integer; T.width := 4Tinteger T.type := integer; T.width := 4Treal T.type := real; T.width := 8Treal T.type := real; T.width := 8Tarray num of TTarray num of T1 1 T.type := array( num.val, T T.type := array( num.val, T1 1.type);.type); T.width := num.val T.width := num.val *
25、* T T1 1.width.widthTTTT1 1 T.type := pointer( T T.type := pointer( T1 1.type); T.width := 4.type); T.width := 4enter(x,real,0)enter(x,real,0)realT:idDT:idD;DPinteger2022-3-839P P offset := 0 D offset := 0 D offset := 0 D ; D offset := 0 D ; D offset := 0 x: T enter( x, T.type, offset ); offset := o
26、ffset + T.width; D offset := 0 x: T enter( x, T.type, offset ); offset := offset + T.width; D offset := 0 x : real T.type := real; T.width := 8 enter( x, T.type, offset := 0 x : real T.type := real; T.width := 8 enter( x, T.type, offset ); offset := offset + T.width; Doffset ); offset := offset + T.
27、width; D x : real ( x, real, 0 ); offset := 8; Dx : real ( x, real, 0 ); offset := 8; D x : real ( x, real, 0 ); offset := 8; i : T enter( , T.type, x : real ( x, real, 0 ); offset := 8; i : T enter( , T.type, offset ) ;offset := offset + T.widthoffset ) ;offset := offset + T.width x :
28、 real ( x, real, 0 ); offset := 8; i : integer T.type := integer; x : real ( x, real, 0 ); offset := 8; i : integer T.type := integer; T.width := 4 enter( i, T.type, offset ) ;offset := offset + T.widthT.width := 4 enter( i, T.type, offset ) ;offset := offset + T.width x : real ( x, real, 0 ); i : i
29、nteger ( i, integer, 8 ) ;offset 12x : real ( x, real, 0 ); i : integer ( i, integer, 8 ) ;offset 122022-3-840 分类分类 同结构的组合数据同结构的组合数据( (同质数据结构同质数据结构) ) 数组、集合数组、集合 异结构的组合数据异结构的组合数据( (异质数据结构异质数据结构) ) 记录、结构、联合记录、结构、联合 抽象数据类型抽象数据类型 类、模块类、模块2022-3-841 操作操作 元素的引用、修改元素的引用、修改: : 数组:数组:Ai,j,Ai,j,k ,k 记录、结构、联合
30、:记录、结构、联合:B.h.jB.h.j 结构的引用、修改:结构的引用、修改:A , BA , B,A.cA.c 分配策略分配策略 静态:直接完成相应的分配工作静态:直接完成相应的分配工作 动态:构造代码,以在运行时调用分配过程动态:构造代码,以在运行时调用分配过程2022-3-842 符号表及有关表格符号表及有关表格( (内情向内情向量量) )处理处理 维数、下标上界、下标下界维数、下标上界、下标下界 空间分配空间分配 首地址、需用空间计算首地址、需用空间计算 存放方式存放方式 按行存放、按列存放按行存放、按列存放影影响具体元素地址的计算响具体元素地址的计算low1up1d1low2Up2d
31、2lownupndncan2022-3-843静态数组分配要完成的工作静态数组分配要完成的工作 数组存放在一个连续的存储区中数组存放在一个连续的存储区中 知道起始地址知道起始地址 要计算该数组的大小要计算该数组的大小 按照与简单变量类似的方式进行分配按照与简单变量类似的方式进行分配2022-3-844 ?哪些要处理的问题?哪些要处理的问题 准备准备 上下界的计算上下界的计算 体积的计算体积的计算 动态分配子程序动态分配子程序 将计算的结果告诉动态分配子程序将计算的结果告诉动态分配子程序 进行分配进行分配动态数组分配要完成的工作动态数组分配要完成的工作2022-3-845动态分配方案下数组说明的
32、代码结构动态分配方案下数组说明的代码结构D id:array low1:up1 , , lown:upn of Tlow1.code送工作单元送工作单元W1up1.code送工作单元送工作单元W2lown.code送工作单元送工作单元W2n-1upn.code送工作单元送工作单元W2n其它参数其它参数( (n,type)n,type)转动态分配子程序入口转动态分配子程序入口? D id:array num of T2022-3-846 数组元素的翻译数组元素的翻译 完成上下界检查完成上下界检查 生成完成相对地址计算的代码生成完成相对地址计算的代码 目标目标 x := yi x := yi 和和
33、 yi := xyi := x y y为数组地址的固定部分为数组地址的固定部分相当于第相当于第1 1个元个元素的地址,素的地址,i i是相对地址,不是数组下标是相对地址,不是数组下标2022-3-847数组元素地址计算数组元素地址计算- -按行存放按行存放 一维数组一维数组AlowAlow1 1:up:up1 1 (n (nk k=up=upk k-low-lowk k+1)+1)Addr(Ai)=base+(i- lowAddr(Ai)=base+(i- low1 1) )* *ww=(base- low=(base- low1 1* *w)w)+i+i* *w=w=c c+i+i* *ww
34、 二维数组二维数组AlowAlow1 1:up:up1 1 , low, low2 2:up:up2 2AiAi1 1,i ,i2 2 Addr(AiAddr(Ai1 1,i ,i2 2)=base+(i)=base+(i1 1- low- low1 1) )* *n n2 2+ (i+ (i2 2-low-low2 2) )* *ww= base+(i= base+(i1 1- low- low1 1) )* *n n2 2* *w+(iw+(i2 2-low-low2 2) )* *ww= base- low= base- low1 1* * n n2 2* *w-loww-low2 2*
35、 *w +iw +i1 1 * * n n2 2* *w+ iw+ i2 2* *ww= = base-(lowbase-(low1 1* * n n2 2 -low -low2 2) )* *ww +(i +(i1 1 * * n n2 2 + i + i2 2) )* *ww=c c+(i+(i1 1* *n n2 2+ i+ i2 2) )* *ww2022-3-848数组元素地址计算数组元素地址计算- -按行存放按行存放 三维数组三维数组AlowAlow1 1:up:up1 1 , low, low2 2:up:up2 2 , low, low3 3:up:up3 3AiAi1 1,i
36、 ,i2 2,i ,i3 3 Addr(AiAddr(Ai1 1,i ,i2 2,i ,i3 3)=base+(i)=base+(i1 1- low- low1 1) )* *n n2 2* *n n3 3 + (i+ (i2 2-low-low2 2) ) * *n n3 3 + (i+ (i3 3-low-low3 3) ) )* *ww= base+(i= base+(i1 1- low- low1 1) )* *n n2 2* *n n3 3* *w+(iw+(i2 2-low-low2 2) ) * *n n3 3* *w w + (i + (i3 3-low-low3 3) ) *
37、 *ww= base- low= base- low1 1* * n n2 2* *n n3 3* *w-loww-low2 2* *n n3 3* *w-loww-low3 3* *w w +i +i1 1 * * n n2 2* *n n3 3* *w+ iw+ i2 2* *n n3 3* *w+ iw+ i3 3* *ww= = base-(lowbase-(low1 1* * n n2 2 -low -low2 2) ) * *n n3 3+low+low3 3) )* *ww +(i +(i1 1 * * n n2 2 + i + i2 2) )* *n n3 3+i+i3 3)
38、)* *ww=c c+(i+(i1 1 * * n n2 2 + i + i2 2) )* *n n3 3+i+i3 3) )* *ww2022-3-849数组元素地址计算数组元素地址计算- -按行存放按行存放寻找计算规律寻找计算规律 一维数组一维数组AlowAlow1 1:up:up1 1 (n (nk k=up=upk k-low-lowk k+1)+1) Addr(Ai Addr(Ai1 1)=)=c c+I+I1 1* *ww 二维数组二维数组AlowAlow1 1:up:up1 1 , low, low2 2:up:up2 2AiAi1 1,i ,i2 2 Addr(Ai Addr(
39、Ai1 1,i ,i2 2)=)=c c+(i+(i1 1* *n n2 2+ i+ i2 2) )* *ww 三维数组三维数组AlowAlow1 1:up:up1 1 , low, low2 2:up:up2 2 , low, low3 3:up:up3 3AiAi1 1,i ,i2 2,i ,i3 3 Addr(Ai Addr(Ai1 1,i ,i2 2,i ,i3 3)=)=c c+(i+(i1 1 * * n n2 2 + i + i2 2) )* *n n3 3+i+i3 3) )* *wwAddr(AE1,E2,.Ek)=c+(E1*n2+ E2)*n3+ Ek-1) *nk+Ek
40、)*w2022-3-851 空间分配空间分配 设置首地址和各元素的相对设置首地址和各元素的相对地址地址 例:例:struct node struct node float x, y; float x, y; struct node struct node * *next;next; node; node; x x y y n n e e x x t t 0482022-3-852 符号表及有关表格处理符号表及有关表格处理 各元素的名字、类型、字节数各元素的名字、类型、字节数 生成代码,完成元素的相对地址的计算生成代码,完成元素的相对地址的计算 目标目标 y := xi y := xi 和和 x
41、i := y xi := y x x 是记录名,是记录名,i i 是相对地址是相对地址 间接地址问题:间接地址问题: * *x = y x = y 2022-3-853编译原理编译原理(Principles of Compiling)n主讲:周翰逊主讲:周翰逊nEmailEmail:nQQQQ:26054036260540362022-3-854上次课主要内容上次课主要内容 相对地址相对地址、属性、属性 静态数据区、动态数据区静态数据区、动态数据区2022-3-855上次课主要内容上次课主要内容内情向量内情向量首地址、需用首地址、需用空间计算空间计算数组元素地址数组元素地址计算计算- -按行存
42、按行存放放lowlow1 1.code.code送工作单元送工作单元WW1 1upup1 1.code.code送工作单元送工作单元WW2 2lowlown n.code.code送工作单元送工作单元WW2n-12n-1low1up1d1low2Up2d2lownupndncanupupn n.code.code送工作单元送工作单元WW2n2nn n,typetype转动态分配子程转动态分配子程序序2022-3-856上次课主要内容上次课主要内容2022-3-857翻译的一般需求翻译的一般需求 充分了解各种语法成分的语义充分了解各种语法成分的语义 包括:控制结构、数据结构、单词包括:控制结构、
43、数据结构、单词 充分了解它们的实现方法充分了解它们的实现方法 目标语言的语义目标语言的语义 了解中间代码的语义了解中间代码的语义 了解运行环境了解运行环境2022-3-858 基本子程序基本子程序 产生一条中间代码产生一条中间代码 gen(code)gen(code),emit(code)emit(code) 产生新的临时变量产生新的临时变量 newtempnewtemp 属性设置属性设置 继续用属性继续用属性codecode表示中间代码序列表示中间代码序列 继续用属性继续用属性placeplace表示存储位置表示存储位置2022-3-859S id := E S.code := E.code
44、 | gen( id.place:=E.place ) E E1 + E2 E.place := newtemp; E.code := E1.code | E2.code | gen(E.place:=E1.place+E2.place)E E1 * E2 E.place := newtemp; E.code := E1.code | E2.code | gen(E.place:=E1.place*E2.place) 2022-3-860E - E1 E.place := newtemp; E.code := E1.code | gen(E.place:=0-E1.place) E ( E1
45、) E.place:= E1.place; E.code:= E1.code E id E.place:= id.place; E.code:= E num E.place:= num.val;E.code:= 2022-3-861S.code S.code E.code | gen( E.code | gen( a:=a:=E.place )E.place )/ /* * a a 为为 id.place id.place * */ / E E1 1.code | E.code | E2 2.code .code | gen( | gen( t3:=t3:=E E1 1.place.place
46、+ +E E2 2.place ) .place ) | gen( | gen( a:=t3a:=t3 ) )/ /* * newtemp t3 newtemp t3为为 E.place E.place * */ / E E11 11.code | gen( .code | gen( t1:= 0 -t1:= 0 - E E11 11.place ) .place ) / /* * newtemp t1 newtemp t1 为为E E1 1.place .place * */ / | | E E2121.code | E.code | E2222.code .code | gen( | ge
47、n( t2:=t2:= E E2121.place.place* *E E2222.place ).place )/ /* * newtemp t2 newtemp t2 为为 E E2 2.place .place * */ / | gen( | gen( t3:=t1+t2t3:=t1+t2 ) | gen( ) | gen( a:=t3a:=t3 ) ) gen( gen( t1:= 0 - ct1:= 0 - c ) | gen( ) | gen( t2:=bt2:=b* *3434 ) ) / /* * c c为为 E E11 11.place .place * */ / /* *
48、b b 为为E E2121.place .place * */ / /* * 3434 为为E E2222.place .place * */ / | gen( | gen( t3:=t1+t2t3:=t1+t2 ) | gen( ) | gen( a:=t3a:=t3 ) )/ /* * E E2121.code.code和和 E E2222.code .code 为空为空 * */ /2022-3-8631) 1) 找出分析中使用的产生式找出分析中使用的产生式2)2)根据产生式的语义规则,计算式子中的各根据产生式的语义规则,计算式子中的各属性属性3)3)反复使用反复使用 1) 1) 和和
49、2) 2) 改写式子,最后得到代改写式子,最后得到代码生成语句组成的式子码生成语句组成的式子 组成语句的翻译结果(中间代码序列)组成语句的翻译结果(中间代码序列)2022-3-864 临时变量空间的统计临时变量空间的统计 了解需求、及时释放了解需求、及时释放 运算合法性检查运算合法性检查 利用符号表保存的名字类型利用符号表保存的名字类型 类型自动转换类型自动转换 填加专用指令填加专用指令2022-3-865类型转换:类型转换: itritr,rtirtiS id := E S.code := E.code | if id.type=E.type then S id := E S.code :=
50、 E.code | if id.type=E.type then gen( id.place:=E.place ) else if id.type=real then gen( id.place:=E.place ) else if id.type=real then gen(id.placegen(id.place:=:= itritr( E.place) else gen(id.place( E.place) else gen(id.place:=:=rtirti ( E.place) ( E.place)E EE E1 1 + E + E2 2 E.place := newtemp; E
51、.code := E E.place := newtemp; E.code := E1 1.code | E.code | E2 2.code | .code | E.type:=EE.type:=E1 1.type.type; ;if Eif E1 1.type=E.type=E2 2.type then gen(E.place:=E.type then gen(E.place:=E1 1.place+E.place+E2 2.place).place)else if Eelse if E1 1.type=real then gen(E.place:=E.type=real then gen
52、(E.place:=E1 1.place+.place+itritr(E(E2 2.place).place)else gen(E.place:=else gen(E.place:=itritr(E(E1 1.place)+.place)+E E2 2.place);.place);E.type=realE.type=real2022-3-866 高级语言的控制结构高级语言的控制结构 顺序顺序 begin begin 语句语句; ; ;语句;语句endend 条件条件 if_then_elseif_then_else、if_thenif_thenswitchswitch、casecase 循环
53、循环 while_dowhile_do、do_while do_while for for、repeat_untilrepeat_until 三地址码三地址码 goto n goto n (j,_,_,n)(j,_,_,n) if x relop y goto nif x relop y goto n (jrelop,x,y,n) (jrelop,x,y,n)2022-3-867 基本文法基本文法EEEE1 1 or E or E2 2 | E| E1 1 and E and E2 2 | not E | not E1 1 | ( E | ( E1 1 ) | id ) | id1 1 rel
54、op id relop id2 2 | | id id 处理方式处理方式 数值表示法(与算术表达式的处理类似)数值表示法(与算术表达式的处理类似) 真:真:E.place=1E.place=1 假:假:E.place=0E.place=0 newtempnewtemp申请临时工作单元申请临时工作单元 真假出口表示法(作为条件控制)真假出口表示法(作为条件控制) 真出口:真出口:E.trueE.true 假出口:假出口:E.falseE.false newlabnewlab申请新标号申请新标号2022-3-868数值表示法数值表示法使用综合属性使用综合属性E EE E1 1 or E or E2
55、 2 E.place := newtemp; E.place := newtemp; E.code := E E.code := E1 1.code | E.code | E2 2.code | .code | gen(E.place:=E gen(E.place:=E1 1.place.placeorEorE2 2.place).place)E EE E1 1 and Eand E2 2 E.place := newtemp; E.place := newtemp; E.code := E E.code := E1 1.code | E.code | E2 2.code | .code |
56、gen(E.place:=Egen(E.place:=E1 1.place.placeandEandE2 2.place).place)E not EE not E1 1 E.place := newtemp; E.place := newtemp; E.code :=E E.code :=E1 1.code | gen(E.place:= notE.code | gen(E.place:= notE1 1.place) .place) 2022-3-869数值表示法数值表示法使用综合属性使用综合属性E ( EE ( E1 1 ) E.place:= E ) E.place:= E1 1.pl
57、ace; E.code:= E.place; E.code:= E1 1.code .code E idE id1 1 relop id relop id2 2 E.place := newtemp;E.place := newtemp;E.code:=gen( ifE.code:=gen( if id id1 1.place relop id.place relop id2 2.place goto nextstat+3)|.place goto nextstat+3)|gen(E.place := 0) | gen(E.place := 0) | gen(goto nextstat+2)|
58、gen(goto nextstat+2)|gen( E.place := 1)gen( E.place := 1)E id E.place:= id.place; E.code:= E id E.place:= id.place; E.code:= 2022-3-870真假出口表示法真假出口表示法使用继承属性使用继承属性E EE E1 1 or E or E2 2 E E1 1.true :=E.true; .true :=E.true; E E1 1.false :=newlab.false :=newlab; ; E E2 2.true :=E.true; E.true :=E.true;
59、 E2 2.false :=E.false; .false :=E.false; E.code := E E.code := E1 1.code | .code | gen(Egen(E1 1.false.false: :) ) |E|E2 2.code .code E EE E1 1 and Eand E2 2 E E1 1.true:=newlab;.true:=newlab; E E1 1.false:= E.false;.false:= E.false; E E2 2.true :=E.true; E.true :=E.true; E2 2.false:=E.false; .false
60、:=E.false; E.code := E E.code := E1 1.code | .code | gen(Egen(E1 1.true.true: :) ) |E |E2 2.code .code E not EE not E1 1 E E1 1.true:=E.false;E.true:=E.false;E1 1.false:=E.true .false:=E.true E.code :=EE.code :=E1 1.code.code2022-3-871真假出口表示法真假出口表示法使用继承属性使用继承属性E ( EE ( E1 1 ) ) E E1 1.true:=E.true:=E. true
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 在公园游学活动方案
- 培训班开业活动方案
- 地球一小时活动方案
- 多彩学科活动方案
- 培训课程活动方案
- 大学工会活动方案
- 处理临期食物活动方案
- 车辆贷款抵押金融服务合同
- 高效供应链采购合同付款明细台账
- 大型团日活动方案
- 环保相关知识培训课件
- 2025年河北高考真题化学试题+解析(参考版)
- 护理事业十五五发展规划(2026-2030)
- 2025至2030中国中药材种植行业运作模式与竞争格局分析报告
- 武汉大学2020年强基计划物理试题(原卷版)
- 2025年随州国投集团公开招聘42名工作人员笔试参考题库附带答案详解
- 2025年3月10日吉林省纪委监察厅遴选面试真题及解析
- 2025年 内蒙古能源集团所属单位招聘考试笔试试题(含答案)
- 2025年“安康杯”安全知识竞赛题库(含答案)
- 2025年江西省高考物理真题
- CJ/T 463-2014薄壁不锈钢承插压合式管件
评论
0/150
提交评论