编译原理6-语义分析与中间代码生成优秀PPT.ppt
《编译原理6-语义分析与中间代码生成优秀PPT.ppt》由会员分享,可在线阅读,更多相关《编译原理6-语义分析与中间代码生成优秀PPT.ppt(136页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、词法分析和语法分析之后的中间代码生成,是编译第三阶段的工作。本章介绍几种典型的中间代码形式,以及产生它的算法。中间代码的形式很多,如逆波兰记号、树形表示、三元式、四元式。他们都是介于单词流与目标指令之间的“中间产品”。目前还不存在一种广泛接受的方式来描述为典型程序语言产生中间代码所需的邻语言的动作。原因是代码生成依赖于对语义的解释,而语义的刻划的形式化系统尚未诞生。为每一个产生式配一个翻译子程序(语义子程序、动作),在语法分析的同时执行它。这样,配上语义动作之后,既指定了串的意义,同时又按这种意义规定了生成某种中间代码应作的基本动作。l语法制导翻译语法制导翻译l逆波兰表示法逆波兰表示法l三元式
2、和树三元式和树l四元式四元式l简单算术表达式和赋值句到四元式的翻译简单算术表达式和赋值句到四元式的翻译l布尔表达式到四元式的翻译布尔表达式到四元式的翻译l控制语句的翻译控制语句的翻译l数组元素的引用数组元素的引用l过程调用过程调用l说明语句的翻译说明语句的翻译l自上而下分析制导翻译自上而下分析制导翻译概概说说在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(语义动作)进行翻译(产生中间代码)的办法。概念标记说明标记说明l描述语义动作时,需要赋予每个文法符号X(终结符或者 非终结符)以种种不同方面的值,如X.TYPE(类型),X.VAL(值)等。l一个产生式中同一符号多次出
3、现,用上角标来区分。E E+E 表示为 E E(1)+E(2)l每个产生式的语义动作,写在该产生式之后的花括号 内。#-S0XX.VALSm-1YY.VALSm文法符号,无须进栈,让其进栈只是为了醒目。须要保存的某些语义信息。事实上为一个指示器,指向分析表的某一行。l先对LR分析器的栈作一些改进,加入语义值。STATEVALSYMTOPl文法及其语义动作(0)S E print E.VAL(1)EE(1)+E(2)E.VAL:=E(1).VAL+E(2).VAL(2)EE(1)*E(2)E.VAL:=E(1).VAL*E(2).VAL(3)E(E(1)E.VAL:=E(1).VAL(4)En
4、E.VAL:=LEXVAL上述的语义动作等于给出了计算由、*组成的整数算术式的过程。其相应的程序段如下:(0)S E print VALTOP(1)EE(1)+E(2)VALTOP:=VALTOP+VALTOP+2(2)EE(1)*E(2)VALTOP:=VALTOP*VALTOP+2(3)E(E(1)VALTOP:=VALTOP+1(4)En VALTOP:=LEXVAL若把语义动作改为产生中间代码的动作,就能随着分析的进展逐步生成中间代码。属性文法属性文法(attribute grammar)属性文法属性文法(也称属性翻译文法也称属性翻译文法)是是KnuthKnuth在在19681968年
5、首年首先提出的。先提出的。它是在上下文无关文法的基础上,为每个文法符它是在上下文无关文法的基础上,为每个文法符号号(终结符或非终结符终结符或非终结符)配备若干相关的配备若干相关的“特性特性”(称(称为属性)。为属性)。这些属性代表与文法符号相关信息,例如它的类这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等等。型、值、代码序列、符号表内容等等。属性与变量一样,可以进行计算和传递。属性加属性与变量一样,可以进行计算和传递。属性加工的过程即是语义处理的过程。工的过程即是语义处理的过程。对于文法的每个产生式都配备了一组属性的计算对于文法的每个产生式都配备了一组属性的计算规则,
6、称为规则,称为语义规则语义规则。所谓属性,其涉及的概念比较广泛,常用以描述所谓属性,其涉及的概念比较广泛,常用以描述事物或人的特征、性质,品质等等。事物或人的特征、性质,品质等等。对编译程序运用的语法树的结点,可以用对编译程序运用的语法树的结点,可以用 类型类型、值值 或或 存储位置存储位置 来描述它。来描述它。一个属性文法包含一个上下文无关文法和一系列一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。语义规则,这些语义规则附在文法的每个产生式上。所谓语法制导的翻译指的是在语法分析过程中,所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作
7、,从而实现语义处理。完成这些语义规则描述的动作,从而实现语义处理。属性文法定义属性文法定义定义定义1:形式上讲,属性文法是一个三元组形式上讲,属性文法是一个三元组:A=(G,V,F),其中:其中:G:是一个上下文无关文法;是一个上下文无关文法;V:有穷的属性集有穷的属性集,每个属性与文法的一个终结符或非终每个属性与文法的一个终结符或非终结符相连结符相连,这些属性代表与文法符号相关信息;这些属性代表与文法符号相关信息;F:关于属性的属性断言或一组属性的计算规则关于属性的属性断言或一组属性的计算规则(称为语称为语义规则义规则)。断言或语义规则与一个产生式相联断言或语义规则与一个产生式相联,只引只引
8、用该产生式左端或右端的终结符或非终结符相联的用该产生式左端或右端的终结符或非终结符相联的属性。属性。定义定义2 2:一个属性文法是一个三元组:一个属性文法是一个三元组:A=(G,V,F),A=(G,V,F),其中其中uG-G-基础文法(基础文法(一个上下文无关文法一个上下文无关文法)uV-V-每个文法符号有一组属性每个文法符号有一组属性uF-F-每个文法产生式每个文法产生式A A有一组形式为有一组形式为b b:=:=f f(c c1 1,c c2 2,c ck k)的语义规则,其中的语义规则,其中f f 是函数,是函数,b b和和c c1 1,c c2 2,c ck k是该产生式文法符号的属性
9、。是该产生式文法符号的属性。属性的类型(从分析过程中属性值的计算方法来分类):1、综合属性综合属性(Synthesized Attributes):属性值是分析树中该结点的子结点的属性值的函数 2、继承属性继承属性(Inherited Attributes):属性值是分析树中该结点的父结点和和/或或兄弟结点的属性值的函数对于产生式 AX1 X2 XnA AX X1 1X X2 2X Xn n计算 A 的综合属性,S(A):=f(I(X1),I(Xn)计算 Xj 的继承属性,T(Xj):=f(I(A),.,I(Xn)v综合属性用于“自下而上”传递信息,继承属性用于“自上而下”传递信息例例1 1
10、综合属性的例子综合属性的例子语 义 规 则 L EE E1+TETT T1*FTFF(E)FdigitPrint(E.val)E.val:=E1.val+T.val E.val:=T.val T.val:=T1.val F.val T.val:=F.valF.val:=E.valF.val:=digit.lexval产 生 式非终结符非终结符E、T及及F都有一个综合属性都有一个综合属性val,符号符号digit仅有仅有一个综合属性,它一个综合属性,它的值由词法分析器的值由词法分析器供应。产生式供应。产生式L E语义规则是一个语义规则是一个过程过程,打印打印E的值的值,也可以理解也可以理解L的属
11、的属性是空的或虚的。性是空的或虚的。综合属性的自下而上定值综合属性的自下而上定值LE.val=19E.val=15T.val=4T.val=15F.val=4T.val=3F.val=3F.val=5digit.lexval=4digit.lexval=5digit.lexval=3+*3*5+4的带注释的分析树的带注释的分析树设表达式为设表达式为设表达式为设表达式为3 35+45+4,则语义动作打印数值,则语义动作打印数值,则语义动作打印数值,则语义动作打印数值1919例例2继承属性的例子继承属性的例子产 生 式语 义 规 则D TL T int T real L L1,idL idL.in
12、:=T.typeT.type=integerT.type:=real L1.in:=L.in addtype(id.entry,L.in)addtype(id.entry,L.in)L.in 属性值置为该说明语句指定的类型,是继承属性继承属性。Addtype是一个过程,功能是把每个标识符的类型信息登陆在符号表的的相关项中。在表所示的语法制导翻译中,非终结符在表所示的语法制导翻译中,非终结符D D产生的声明由产生的声明由关键字关键字intint或或realreal及标识符表组成,非终结符及标识符表组成,非终结符T T有综合属有综合属性性typetype,它的值由声明中的关键字确定。,它的值由声明
13、中的关键字确定。继承属性的自上而下定值继承属性的自上而下定值Real id1,id2,id3DL.in=realL.in=realL.in=realT.type=realrealid2id1id3.,产 生 式语 义 规 则D TL T int T real L L1,idL idL.in:=T.typeT.type=integerT.type:=real L1.in:=L.in addtype(id.entry,L.in)addtype(id.entry,L.in)属性依靠图属性依靠图依靠图是一个有向图,用于描述分析树中的属性和属性之依靠图是一个有向图,用于描述分析树中的属性和属性之间的相互
14、依靠关系。间的相互依靠关系。依靠图构造算法:依靠图构造算法:for 语法树中每一结点n do for 结点n的文法符号的每一个属性a do 为a在依靠图中建立一个结点;for 语法树中每一个结点n do for 结点n所用产生式对应的每一个语义规则 b:=f(c1,c2,ck)do for i:=1 to k do 从ci结点到b结点构造一条有向边;注注:在构造依靠图之前在构造依靠图之前,要为每一个过程调用的语义规则引入一要为每一个过程调用的语义规则引入一个虚综合属性,即在依靠图中构造一个结点。这样,若属性个虚综合属性,即在依靠图中构造一个结点。这样,若属性b依靠于属性依靠于属性c,则从,则从
15、c的结点有一条有向边连接到的结点有一条有向边连接到b的结点。的结点。D intT,id3LLLid2id1,1 entry102 entry3 entryin 98in 76in 54 typeint id1,id2,id3的依靠图的依靠图产 生 式语 义 规 则D TL T int T real L L1,idL idL.in:=T.typeT.type=integerT.type:=real L1.in:=L.in addtype(id.entry,L.in)addtype(id.entry,L.in)大部分的编译器都不直接产生目标代码,虽然这是可以实现的,但是产生的代码不是最优的。因为这
16、涉及到寄存器的分配问题,在语义分析阶段,很难有效地分配它们。中间代码的必要性引入中间代码的目的1.便利生成目标代码;2.便于优化;3.便于移植。波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示法。一般,若e1,e2为任意的后缀表达式,为任意双目运算符,则用作用于e1和e2所代表的结果用后缀式e1e2 表示。推而广之,为k目运算符,则作用于e1e2ek的结果用e1e2ek 来表示。概念l a*(b+c)abc+*l(a+b)*(c+d)ab+cd+*若用?表示if-then-else,则lIf a then if c-d then a+c else a*c else a+b a c
17、d-ac+ac*?ab+?示例使用一个栈(软件栈或者硬件栈)来求值。求值过程:从左到右扫描后缀式,每碰到运算量就把它推进栈,每碰到k目运算符就把它作用于栈顶的k个项,并用运算结果来代替这k个项。1 1 3 3+5 5*4 43+1=3+1=5*4=5*4=2020前面讲到,if-then-else运算符的实现”exy?”e不等于0,取x,否则取y.这种表示法要求在任何情况下都要把x,y都计算出来,尽管只用到其中一个。而且,如果运算量无定义或者有副作用,则后缀表示法不仅无效,而且可能是错误的。引入标号,在后缀式中加入条件转移,无条件转移算符。存储方式后缀式存放在一维数组POST1.N中,每个元素
18、是运算符或者分量(指向符号表)。p jump 转到POSTp e1e2pjlt e1BC不合法。布尔表达式(E)在语言中的用途 求值 X:=ABD 条件控制 WHILE ABD DO S IF ABD THEN S1 ELSE S2布尔表达式的求值1 通常算法,如同算术表达式求值一样,一步步地计算各部分的值,进而计算出整个表达式的值。2 采用优化措施 AB if A then true else B AB if A then B else false A if A then false else true说明 上述两种计算方法对于不包含布尔函数调用的式子是没有什么差别的。仅当遇到布尔函数调用,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语义 分析 中间 代码 生成 优秀 PPT
限制150内