new《编译原理》第五章.ppt
《new《编译原理》第五章.ppt》由会员分享,可在线阅读,更多相关《new《编译原理》第五章.ppt(193页珍藏版)》请在三一办公上搜索。
1、编 译 原 理Compiler Principles,蒋 凌云南京邮电大学.计算机学院,第五章 语法制导翻译及中间代码生成,教材:编译技术原理及其实现方法王汝传 编著,第五章 语法制导翻译及中间代码生成,本章内容,5.1 语法制导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现5.2 中间语言 一、引言 二、逆波兰表示 三、三元式 四、树形表示 五、四元式,第五章 语法制导翻译及中间代码生成,本章内容,5.3 自底向上语法制导翻译 一、简单算术表达式和赋值语句的翻译 二、布尔表达式的翻译 三、控制语句翻译*四、数组元素的翻译 五、过程语句的翻译 六、说明语句的翻译5.
2、4 自顶向下语法制导翻译 一、递归下降的语法制导翻译 二、LL(1)语法制导翻译5.5 属性文法与属性翻译 一、属性文法与L属性文法 二、属性翻译,第五章 语法制导翻译及中间代码生成,本节内容,5.1 语法制导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现5.2 中间语言 一、引言 二、逆波兰表示 三、三元式 四、树形表示 五、四元式,5.1 语法制导翻译概述,本节内容,一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现,第五章 语法制导翻译及中间代码生成,5.1 语法制导翻译概述 在前面我们已经讨论了词法分析和语法分析,一个程序成功地通过词法分析和语
3、法分析,只能说明它是一个合法程序,但是对程序内部的逻辑含义并未加以考虑,从整个编译程序来看,词法分析和语法分析仅仅是编译程序的一部分,编译程序最终的目的是将源程序翻译成可供计算机直接执行的目标程序。在某些编译程序中,是直接生成机器语言或汇编语言形式的目标代码;有些编译程序是把源程序翻译为某种形式中间语言代码,然后再把中间语言代码翻译为目标代码。下面就来介绍一种语法制导翻译方法,这种方法先将源程序单词序列翻译成中间语言,然后再将中间语言翻译成目标程序。那么,什么叫语法制导翻译呢?,第五章 语法制导翻译及中间代码5.1 语法制导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译
4、实现,第五章 语法制导翻译及中间代码5.1 语法制导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现,5.1 语法制导翻译概述 一、语法制导翻译定义 语法制导翻译就是以语法分析为主导的语义处理。在自顶向下语法分析 过程中嵌入语义动作,即调用对应的语义子程序。例如在前面语法分析时分析a+b*c表达式,其分析语法树如下:,E,+,E,E,*,E,E,a,b,c,语法分析是将a归约E,再将b归约E,将c归约为E,然后再将E*E归约成E,再将E+E归约成E,所以a+b*c是一个合法的句子。如果考虑语义,在归约过程中加上语义动作,先将a归约为E,将a值赋给E后,b归约成E,同时
5、将b值赋给E,在将c值赋给E,然后再将b*c(E*E)给E,最后再将左右两个E值相加就是最终结果,这就是语法制导翻译的基本思想,在语法分析同时进行语义分析。,第五章 语法制导翻译及中间代码5.1 语法制导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现,第五章 语法制导翻译及中间代码5.1 语法制导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现,5.1 语法制导翻译概述 二、语法制导翻译原理 语法制导翻译的原理就是先为每个文法规定相应的语义,即编写出相应语义处理子程序,整个分析是以语法分析为主导。在自顶向下语法分析时,若某一个规则右部与输入
6、串相匹配时,或者,在自底向上语法分析时,当一个规则被用于归约时,此时该规则对应的语义子程序就进入工作,完成既定翻译任务,产生与语义相应的中间代码或目标代码。语义动作:给每个文法符号X赋以各种不同的语义值 这里的语义值不一定指具体数值,可以是“类型”、“种属”、“地址”或“代码”等,我们用记号XTYPE、XCAT或XVAL来表示这些值。如果某规则的右部有若干个同一符号出现,那么我们就用上角标来区别这些符号。例如,假定有如下规则和语义动作:,例如,假定有如下规则和语义动作:E=E(1)+E(2)EVAL:=E(1)VAL+E(2)VAL语义动作写在规则之后的花括号里,这里语义动作是表明与规则左部文
7、法符号E相关的语义值EVAL,它是通过把规则右部文法符号的语义值E(1)VAL和E(2)VAL加在一起来决定的,规则中终结符号“+”按语义规则被解释成通常“加”的意思。各规则的语义动作可以对表达式计算,也可以生成中间代码,甚至还可以来产生目标指令。例5.1 设有文法 E=E+E E=digit这里digit代表0和9之间任一数字,如果我们的目的仅是为了求值,则语义动作如下(1)E=E(1)+E()EVAL:=E(1)VAL+E(2)VAL(2)E=digit EVAL:=digit假定语义动作中的“+”代表是整型加算术运算。规则(1)的语义动作为:E的语义值EVAL等于E(1)和E(2)的语义
8、值E(1)VAL和E(2)VAL之和.规则(2)的语义动作为:E的语义值为09之间任一个数.这样,按照它们的语义动作,我们在分析每个句子的同时一步一步地算出每个句子的值。,例如,假定有输入串1+2+3,我们通过语法树的分析来看如何进行语法制导翻译,来求出该句子最后值。输入串1+2+3的语法树如下图所示:,下面我们采用自底向上归约过程。首先考虑底层最左E的结点,这个结点对应于规则E=1和语义动作EVAL:=1。这样,底层最左的E的值1与语义值EVAL相关。类似地,值2与该结点的右兄弟的语义值EVAL相关。如下图所示:,E,+,E,E,+,E,E,1,2,3,在图所示子树中,子树根处EVAL的语义
9、值是3,这可用语义动作 EVAL:=E(1)VAL+E(2)VAL算出。使用这个语义动作时,以底部最左的E的 EVAL的值来代替E(1)VAL,而以右边E的EVAL的值代替E(2)VAL。以这种方法继续下去,我们就推出如下图所示整个语法树每个结点的语义值。,E,+,E,E VAL=1,E,1,2,E VAL=2,E,+,E VAL=6,E,E VAL=3,E,E VAL=3,+,E,E VAL=1,E,E VAL=2,1,2,3,第五章 语法制导翻译及中间代码5.1 语法制导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现,第五章 语法制导翻译及中间代码5.1 语法制
10、导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现,5.1 语法制导翻译概述 三、语法制导翻译实现 上面我们从原则上讨论了语法制导翻译的原理,下面我们通过一个自底向上LR分析看如何实现语法制导翻译。例如:有规则:(1)X=动作1(2)Y=动作2(3)A=XY 动作3 当使用规则(1)、(2)归约时,动作1和动作2 工作结果的有关信息(作为X和Y的语义值)应暂时保存下来,以便以后用规则(3)在归约时(动作3)可引用这些值。现在对LR分析器的分析栈加以扩充,为了在语法分析过程中平行地进行语义处理,使得每个文法符号之后都跟着它的语义值,因此,设置一个语义信息栈,为了清晰起见
11、,我们把这个分析栈每一项分三部分组成:状态STATE、文法符号SYM和语义值VAL。这样,分析栈如下图所示。,TOP,STATE,VAL,SYM,TOP(100),归约前,TOP(99),归约后,YVAL,TOP(99),求值后,AVAL:=YVAL和XVAL的处理结果,我们假定先归约后执行语义子程序,所以当X,Y归约为A时,此时栈顶指针下退。例如:开始TOP指100 VALTOP:=Y.VAL(100)VALTOP-1:=X.VAL(99)若归约后,此时TOP指99,所以VALTOP:=X.VAL(99)VALTOP+1:=Y.VAL(100)若求值后,此时TOP指99,所以VALTOP:=
12、A.VAL(99),例5.2 考虑下面文法及其语义描述:规 则 语义动作(0)S=E print EVAL(1)E=E(1)+E(2)EVAL:=E(1)VAL+E(2)VAL(2)E=E(1)*E(2)EVAL:=E(1)VAL*E(2)VAL(3)E=(E(1)EVAL=E(1)VAL(4)E=i EVAL:=LEXVAL其中:语义动作中的+、*代表整型加、乘算术运算,而且词法分析程序将送来每个i的整型内部值LEXVAL。假定语义动作是紧接在归约之后执行的。上面所列的语义动作就相当于下面所列的程序段:,规 则 程序段(0)S=E print VALTOP(1)E=E(1)+E(2)VALT
13、OP:=VALTOP+VALTOP+2(2)E=E(1)*E(2)VALTOP:=VALTOP*VALTOP+2(3)E=(E(1)VALTOP:=VALTOP+1(4)E=i VALTOP:=LEXVAL,由于有一个“+“号,所以为TOP+2,由于有一个“(“号,所以为TOP+1,由于有一个”*”号,所以为TOP+2,根据上述程序段,若输入2*3+2,就有如下图所示的语法制导翻译的分析树。,S,E,E,E,E,E,+,*,2,2,3,E VAL=8,E VAL=6,E VAL=2,E VAL=2,E VAL=3,LEXVAL=2,LEXVAL=3,LEXVAL=2,对2*3+2利用P136.
14、表4.23进行分析和翻译(实为计算值)该输入串过程如下表所示。当状态1面临#时对应的分析动作为acc(接受),此时,相应的语义动作为print VALTOP,即输出语义程序的计值结果:8。,第五章 语法制导翻译及中间代码生成,本节内容,5.1 语法制导翻译概述 一、语法制导翻译定义 二、语法制导翻译原理 三、语法制导翻译实现5.2 中间语言 一、引言 二、逆波兰表示 三、三元式 四、树形表示 五、四元式,第五章 语法制导翻译及中间代码生成,5.2 中间语言 一、引言 1.什么是中间语言 2.为什么要引入中间语言 二、逆波兰表示 1.表达式逆波兰表示 2.逆波兰表示的扩充 3.语法制导翻译生成后
15、缀式 三、三元式 1.三元式 2.间接三元式 四、树形表示 1.表示方法 2.树表示生成 五、四元式,第五章 语法制导翻译及中间代码生成,5.2 中间语言 一、引言 1.什么是中间语言 2.为什么要引入中间语言 二、逆波兰表示 1.表达式逆波兰表示 2.逆波兰表示的扩充 3.语法制导翻译生成后缀式 三、三元式 1.三元式 2.间接三元式 四、树形表示 1.表示方法 2.树表示生成 五、四元式,第五章 语法制导翻译及中间代码生成,5.2 中间语言 一、引言 1.什么是中间语言 2.为什么要引入中间语言 二、逆波兰表示 1.表达式逆波兰表示 2.逆波兰表示的扩充 3.语法制导翻译生成后缀式 三、三
16、元式 1.三元式 2.间接三元式 四、树形表示 1.表示方法 2.树表示生成 五、四元式,5.2 中间语言 一、引言 1.什么是中间语言 就是和源程序等价的一种编码形式,其复杂性介于源程序 和机器语言中间。,源程序,前端,中间代码,代码优化器,中间代码,代码生成器,目标程序,符号表,第五章 语法制导翻译及中间代码生成,5.2 中间语言 一、引言 1.什么是中间语言 2.为什么要引入中间语言 二、逆波兰表示 1.表达式逆波兰表示 2.逆波兰表示的扩充 3.语法制导翻译生成后缀式 三、三元式 1.三元式 2.间接三元式 四、树形表示 1.表示方法 2.树表示生成 五、四元式,5.2 中间语言 一、
17、引言 2.为什么要引入中间语言(1)为了使编译程序结构上逻辑简单明确(2)为了便于目标代码优化工作(3)便于目标代码生成,第五章 语法制导翻译及中间代码生成,5.2 中间语言 一、引言 1.什么是中间语言 2.为什么要引入中间语言 二、逆波兰表示 1.表达式逆波兰表示 2.逆波兰表示的扩充 3.语法制导翻译生成后缀式 三、三元式 1.三元式 2.间接三元式 四、树形表示 1.表示方法 2.树表示生成 五、四元式,第五章 语法制导翻译及中间代码生成,5.2 中间语言 一、引言 1.什么是中间语言 2.为什么要引入中间语言 二、逆波兰表示 1.表达式逆波兰表示 2.逆波兰表示的扩充 3.语法制导翻
18、译生成后缀式 三、三元式 1.三元式 2.间接三元式 四、树形表示 1.表示方法 2.树表示生成 五、四元式,第五章 语法制导翻译及中间代码生成,5.2 中间语言 一、引言 1.什么是中间语言 2.为什么要引入中间语言 二、逆波兰表示 1.表达式逆波兰表示 2.逆波兰表示的扩充 3.语法制导翻译生成后缀式 三、三元式 1.三元式 2.间接三元式 四、树形表示 1.表示方法 2.树表示生成 五、四元式,5.2 中间语言 二、逆波兰表示 1.表达式逆波兰表示(1)波兰表示的概念 对于一个算术表达式A+B或逻辑表达式AB,根据运算符和运算 对象的位置关系,可分为三种等价表示形式:1)中缀表示法 运算
19、符在运算对象中间,如:A+B,A B,a+b*(c+d*(e-f)等.2)后缀表示法 将运算符放在运算对象后面,通常将后缀表示称为逆波兰表示.如:A+B表示为AB+,A B表示为AB,a+b*c表示为abc*+对于逆波兰表示非常适合机械处理,只要从左到右按运算顺序 一个个计算下去3)前缀表示法 即将运算符放在运算对象前面。如:+AB,AB,,例如表达式中缀表示和后缀表示如下表所示(p155表5.2),说明:以后我们主要讨论逆波兰表示,即后缀表示,因前缀表示并不常用,所以有时也将后缀表示笼统地统称为波兰表示。从上表中可以看出:(1)在中缀表示和后缀表示中,运算对象按相同次序出现。(2)在后缀表示
20、中,运算符是按实际计算顺序从左到右排列,且每一运算符总是跟在它的运算对象之后。,(2)逆波兰(后缀)表示的优点 1)后缀表示是一种无括号表示法,不但简明,而且又确切规 定了计算顺序。2)运算处理极其简单方便,只要从左到右扫描后缀表达式 各个符号,就能进行对表达式的处理 一般步骤是从左到右扫描后缀表达式各个符号,每碰到运算对象时就把它推进栈,每碰到一个K元运算符时,就取出栈顶的K个运算对象进行相应的运算,并且用运算结果去替换栈顶的K个运算对象,然后再继续扫描表达式中余留符号,如此等等,直到整个表达式计算完毕为止。当上述过程结束后,整个表达式之值将留于栈顶。3)便于生成目标指令,(3)逆波兰(后缀
21、)表示的形成 为了说明逆波兰(后缀)表示的形成,荷兰学者W.DEJKSTRA给出下面形象的解释。,比栈顶高进栈,比栈顶低或相同的退栈,下面用图解形式来说明A+B*C形成的过程。,A,运算对象A移进对象栈,#,+B*C#,下面用图解形式来说明A+B*C形成的过程。,A,#,向下进运算符栈,#,B*C#,下面用图解形式来说明A+B*C形成的过程。,AB,运算对象B移进对象栈,#,*C#,下面用图解形式来说明A+B*C形成的过程。,AB,*+,*向下进运算符栈,*#,C#,下面用图解形式来说明A+B*C形成的过程。,ABC,运算对象C移进对象栈,*#,#,下面用图解形式来说明A+B*C形成的过程。,
22、ABC*,#*,*退栈往左,#,#,下面用图解形式来说明A+B*C形成的过程。,ABC*,#,退栈往左,#,#,最后生成A+B*C的后缀式ABC*,(4)用后缀表式对表达式处理的过程 下面通过求后缀表达式ab+c*的值,来说明用后缀表式对表达式处理的过程 设a,b和c分别为1,3和5,为了求1 3+5*的值,其计算过程如下:1)把1推进栈。2)把3推进栈。3)将栈顶两个元素1和3相加,使它们退出栈,然后把 结果4存入栈。4)把5推进栈。5)将栈顶两个元素4和5相乘,使它们退出栈,然后将 结果20存入栈。结束时栈顶的值(这里是20)是整个表达式值。,第五章 语法制导翻译及中间代码生成,5.2 中
23、间语言 一、引言 1.什么是中间语言 2.为什么要引入中间语言 二、逆波兰表示 1.表达式逆波兰表示 2.逆波兰表示的扩充 3.语法制导翻译生成后缀式 三、三元式 1.三元式 2.间接三元式 四、树形表示 1.表示方法 2.树表示生成 五、四元式,5.2 中间语言 二、逆波兰表示 2.逆波兰表示的扩充 只要遵守在运算对象后直接紧跟运算符这条规则,我们就可以简单地把这种后缀式扩充到比通常表达式更大范围,即扩充到程序语言的其它语法成分。(1)赋值语句 左部:=表达式把赋值号“:=”看成是一个赋值运算符,它的后缀式为 左部表达式的后缀式:=例如:x:=5 x:=a*b-c/d的后缀式分别为 x5:=
24、xab*cd/-:=,赋值语句的后缀式的处理方法和后缀式表达式处理方法类似。所不同的是栈中保存的是左部变量的地址,而不是其值,在赋值运算处理结束后,不产生任何中间计算结果,因而也不存在保存中间计算结果的问题,而是把存放在运算栈中栈顶两项左部和表达式的值这两个量退掉。,(2)条件语句 if E then S1 else S 对于用后缀式来表示条件语句,我们假定后缀式中各符号存放在一个一维数组POST1n之中,每一个数组元素存放一个运算对象或运算符。同时我们约定如下几个符号:JUMP表示无条件转;JLT表示小于转;JEZ表示零转。后缀式P JUMP表示无条件转移到下标P所指那个元素POSTp(即从
25、该符号开始继续执行)。后缀式e P JEZ表示当后缀表达式e的值为零时,则转移至POSTP。后缀式e1e2 P JLT表示当后缀表达式e1小于后缀表达式e2时,则转移至POSTP,于是,对于形如if e then S1 else S2的条件语句可按后缀式写成ep1JEZ S1p2JUMP S2我们约定e0时,该条件语句的值是S1,否则等于S2。对于后缀式条件语句中:e、S1和S2 分别是e、S1和S2的后缀式。此外,p1表示S2 在数组POST的起始位置,p2表示S2 之后那个符号位置。上述后缀式条件语句的意思是,若e=0时,则转至POSTp1对S2 进行计算,否则计算S1,然后转到POSTp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 new 编译 原理 第五
链接地址:https://www.31ppt.com/p-6513004.html