首页 编译原理第7章

编译原理第7章

举报
开通vip

编译原理第7章编译原理第七章语义分析和中间代码生成编译原理第*页语义分析和中间代码产生 紧接在词法分析和语法分析之后,编译程序要做的工作就是进行静态语义检查和翻译。 静态语义检查(1)类型检查。如果操作符作用于不相容的操作数,编译程序必须报告出错信息。(2)控制流检查。控制流语句必须使控制转移到合法的地方。(3)一致性检查。在很多场合要求对象只能被定义一次。(4)相关名字检查。其它如名字的作用域分析等。编译原理第*页语义分析和中间代码产生 使用中间语言的好处(1)便于进行与机器无关的代码优化工作;(2)使编译程序改变目标机更容易...

编译原理第7章
编译原理第七章语义分析和中间代码生成编译原理第*页语义分析和中间代码产生 紧接在词法分析和语法分析之后,编译程序要做的工作就是进行静态语义检查和翻译。 静态语义检查(1)类型检查。如果操作符作用于不相容的操作数,编译程序必须 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 出错信息。(2)控制流检查。控制流语句必须使控制转移到合法的地方。(3)一致性检查。在很多场合要求对象只能被定义一次。(4)相关名字检查。其它如名字的作用域分析等。编译原理第*页语义分析和中间代码产生 使用中间语言的好处(1)便于进行与机器无关的代码优化工作;(2)使编译程序改变目标机更容易;(3)使编译程序的结构在逻辑上更为简单明确。以中间语言为界面,编译前端和后端的接口更清晰。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生本章内容目录 中间语言 后缀式 图表示法 三地址代码 说明语句 过程中的说明谙旬 保留作用域信息 记录中的域名 赋值语句的翻译 简单算术表达式及赋值语句 数组元素的引用 布尔表达式的翻译 数值表示法 作为条件控制的布尔式翻译 控制语句的翻译编译原理第*页语义分析和中间代码产生中间语言 几种常见的中间语言形式后缀式三地址代码(包括三元式、四元式、间接三元式)DAG图表示编译原理第*页语义分析和中间代码产生后缀式 后缀式表示法又称逆波兰表示法。 这种表示法是把运算量(操作数)写在前面,把算符写在后面(后缀)。 例如,把a十b写成ab+,把a*b写成ab*。编译原理第*页语义分析和中间代码产生一个表达式E的后缀形式 (1)如果E是一个变量或常量,则E的后缀式是E自身。 (2)如果E是E1opE2形式的表达式,这里op是任何二元操作符,则E的后缀式为E1′E2′op,这里E1′和E2′分别为E1和E2的后缀式。 (3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。 后缀式表示法用不着使用括号。根据运算量和算符出现的先后位置,以及每个算符的目数,就完全决定了一个表达式的分解。编译原理第*页语义分析和中间代码产生 只要知道每个算符的目数,对于后缀式,不论从哪一端进行扫描,都能对它正确进行唯一分解。编译原理第*页语义分析和中间代码产生图表示法 包括DAG与抽象语法树 无循环有向图(DirectedAcycliGraph简称DAG)。 与抽象语法树一样,对表达式中的每个子表达式,DAG中都有一个结点。一个内部结点代表一个操作符,它的孩子代表操作数。 与抽象语法树不同的是,在一个DAG中代公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树。编译原理第*页语义分析和中间代码产生 例如,表达式a+a*(b-c)+(b-c)*d编译原理第*页语义分析和中间代码产生 例如,表达式a+a*(b-c)+(b-c)*d编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生 后缀式即是对抽象语法树的后续遍历序列例:上图中的抽象语法树的后缀式是:abcuminus*bcuminu*+assign 抽象语法树的边没有显式地出现在后缀式中,这些边可以根据结点出现的次序及表示操作符的结点要求操作数的个数还原出来。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生三地址代码 三地址代码是由下面一般形式的语句构成的序列:x:=yopz 其中,x,y,z为名字、常数或编译时产生的临时变量;op代表运算符号如定点运算符、浮点运算符、逻辑运算符等等。每个语句的右边只能有一个运算符。 例如,源语言表达式x+y*z可以被翻译为如下语句序列:T1:=y*zT2:=x+T1 其中,Tl,T2为编译时产生的临时变量。编译原理第*页语义分析和中间代码产生 三地址代码可以看成是抽象语法树或DAG的一种线性表示。编译原理第*页语义分析和中间代码产生 三地址语句类似于汇编语言代码。语句可以带有符号标号,而且存在各种控制流语句。符号标号代表存放中间代码的数组中三地址代码语句的下标。 下面列出所使用的三地址语句的种类。(1)形如x:=yopz的赋值语句,其中op为二元算术算符或逻辑算符。(2)形如x:=opy的赎值语句,其中op为一元算符,如一元减ununus,逻辑非not,移位算符及转换算符(如将定点数转换成浮点数)。(3)形如x:=y的复制语句,它将y的值赋给x。(4)形如gotoL的无条件转移语句,即下一条将被执行的语句是带标号L的三地址语句。编译原理第*页语义分析和中间代码产生(5)形如ifxrelopygotoL或ifagotoL的条件转移语句。第一种形式语句施用关系运算符号relop(如<,=,>,=等等)于x和y,若x与y满足关系relop,那么下面就执行带标号L的语句,否则下面就继续执行if语句之后的语句。第二种形式的语句中,a为布尔变量或常量,若a为真,则执行带标号L的语句,否则执行后一条语句。(6)用于过程调用的语句paramx和callp,n,以及返回语句returny.源程序中的过程调用语句P(xl,x2,…,xn)通常产生如下的三地址代码:paramx1paramx2……paramxncallp,n 其中n表示实参个数。过程返回语句retumy中y为过程返回的一个值。编译原理第*页语义分析和中间代码产生(7)形如x:=y[i]及x[i]:=y的索引赋值。前者把相对于地址y的后面第i个单元里的值赋给x。后者把y的值赋给相对于地址x后面的第i个单元。(8)形如x:=&y,x:=*y和*x:=y的地址和指针赋值。其中第一个赋值语句把y的地址赋给x。假定y是个名字,或者是一个临时变量,代表一个具有左值的表达式,例如A[i,j];并且x是一个指针名字或临时变量。也就是说,x的右值将被赋予对象y的左值。第二个赋值语句x:=*y,假定y是一个指针或者是一个其右值为地址的临时变量。此语句执行的结果是把y所指示的地址单元里存放的内容赋给x.第三个赋值语句*x:=y,将把x所指向的对象的右值赋给y的右值。编译原理第*页语义分析和中间代码产生 在设计中间代码形式时,运算符的选择是非常重要的。 显然,算符种类应足以用来实现源语言中的运算。 一个小型算符集合较易于在新的目标机器上实现。 然而,用局限的指令集合会使某些源语言运算表示成中间形式时代码加长,从而需要在目标代码生成时做较多的工作以获得高效的代码。编译原理第*页语义分析和中间代码产生 生成三地址代码时,临时变量的名字对应抽象语法树的内部结点。 对于产生式E→E1+E2的左端的非终结符号E而言,它的经过计算得出的值往往放到一个新的临时变量T中。 一般说来,赋值语句id:=E的三地址代码包括: 对表达式E求值并置于变量T中,然后进行赋值id.place:=T. 如果一个表达式仅有一单个标识符,例如Y,则由Y自身保留表达式的值。编译原理第*页语义分析和中间代码产生 下表是为赋值语句生成三地址代码的S-属性文法定义。如给定输入a:=b*-c+b*-c。 非终结符号S有综合属性S.code,它代表赋值语句S的三地址代码。 非终结符号E有如下两个属性:(1)E.place表示存放E值的名字;(2)E.code表示对E求值的三地址语句序列。 函数newtemp的功能是,每次调用它时,将返回一个不同临时变量名字,如T1,T2,…。为了方便,我们在表使用gen(x‘:=’y‘+’z)表示生成三地址语句x:=y十z.代替x,y或z出现的表达式在传递给gen时求值,用单引号括起来的运算符或操作数将保留引号里字面的符号。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生 三地址语句可看成中间代码的一种抽象形式。 编译程序中,三地址代码语句的具体实现可以用记录表示,记录中包含表示运算符和操作数的域。 通常有三种表示方法:四元式、三元式、间接三元式。编译原理第*页语义分析和中间代码产生四元式 一个四元式是一个带有四个域的记录结构,这四个域分别称为op、arg1,arg2及result. 域op包含一个代表运算符的内部码。 三地址语句x:=yopz可表示为:将y置于argl域,置于arg2域,x置于result域,:=为算符。 带有一元运算符的语句如:x:=-y或者x:=y的表示中不用arg2.而像param这样的运算符仅使用argl域。 条件和无条件转移语句将目标标号置于result域中。编译原理第*页语义分析和中间代码产生三元式 为了避免把临时变量填入到符号表,可以通过计算这个临时变量值的语句的位置来引用这个临时变量。 这样表示三地址代码的记录只需三个域:op、argl和arg2编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生间接三元式 为了便于代码优化处理,有时不直接使用三元式表,而是另设一张指示器(称为间接码表),它将按运算的先后顺序列出有关三元式在三元表中的位置。 换句话说就是,用一张间接码表辅以三元式表的办法来表示中间代码。这种表示法称为间接三元式。编译原理第*页语义分析和中间代码产生 例如,语句X:=(A+B)*C;Y:=D↑(A+B)的间接三元式表示如表所示。编译原理第*页语义分析和中间代码产生四元式与三元式和间接三元式作一些比较 四元式之间的联系是通过临时变量实现的。这一点和三元式不同。要更动一张三元表是很困难的,它意味着必须改变其中一系列指示器的值。但要更动四元式表是很容易的,因为调整四元式之间的相对位置并不意味着必须改变其中一系列指示器的值。因此,当需要对中间代码进行优化处理时,四元式比三元式要方便得多。 对优化这一点而言,四元式和间接三元式同样方便。编译原理第*页语义分析和中间代码产生说明语句 当考查一个过程或分程序的一系列说明语句时,便可为局部于该过程的名字分配存储空间。 对每个局部名字,我们都将在符号表中建立相应的表项,并填入有关的信息如类型、在存储器中的相对地址等。 相对地址是指对静态数据区基址或 活动记录 关爱留守儿童活动记录表初三物理集体备课活动记录初中乒乓球社团活动记录电脑绘画兴趣小组活动记录电脑社团活动记录 中局部数据区基址的一个偏移量。编译原理第*页语义分析和中间代码产生 当产生中间代码地址时,对目标机一些情况做到心中有数是有好处的。 例如,假定在一个以字节编址的目标机上,整数必须存放在4的倍数的地址单元,那么,计算地址时就应以4的倍数增加。编译原理第*页语义分析和中间代码产生过程中的说明语句 在C,Pascal及FORTRAN等语言的语法中,允许在一个过程中的所有说明语句作为一个组来处理,把它们安排在一所数据区中。 从而需要一个全程变量如offset来跟踪下一个可用的相对地址的位置。编译原理第*页语义分析和中间代码产生 在下图关于说明语句的翻译模式中,非终结符号P产生一系列形如id:T的说明语句。 在处理第一条说明语句之前,先置offset为0,以后每次遇到一个新的名字,便将该名字填入符号表中并置相对地址为当前offset之值, 然后使offset加上该名字所表示的数据对象的域宽。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生 过程enter(name,type,offset)用来把名字name填入到符号表中,并给出此名字的类型type及在过程数据区中的相对地址offset。 非终结符号T有两个综合属性T.type和T.width,分别表示名字的类型和名字的域宽(即该类型名字所占用的存储单元个数)。 在图中,假定整数类型域宽为4;实数域宽为8;一个数组的域宽可以通过把数组元素数目与一个元素的域宽相乘获得;每个指针类型的域宽假定为4.编译原理第*页语义分析和中间代码产生 如果把图中的第一条产生式及其语义动作写在一行,则对offset赋初值更明显,如下式所示:P→{offset:=0}D(7.1) 前面曾谈到产生ε的标记非终结符号,可以用它来重新改写上述产生式以便语义动作均出现在整个产生式的右边。 我们可采用标记非终结符号M来重写式(7.1):P→MDM→ε{offset:=0}编译原理第*页语义分析和中间代码产生保留作用域信息 允许嵌套过程的语言,对于每一个过程,其中局部名字的相对地址计算可以采用图7.6的方法。 而当遇到一个嵌入的过程说明时,则应当暂停包围此过程的外围过程说明语句的处理。这种方法可以通过加入到如下的语言把有关语义动作来说明。P→DD→D;D|id:T|procid:D;S(7.2) 由于我们当前的目标是考虑说明语句,因而对其中产生语句的非终结符号S及产生类型的非终结符号T的产生式我们没有给出。与图7.6中相同.T有两个综合属性type和width。编译原理第*页语义分析和中间代码产生 假定对于式(7.2)的语言的每一个过程都有一张独立的符号表。这种符号表可用链表实现。当碰到过程说明D→procid;D,;S时,便创建一张新的符号表,并且把在D,中的所有说明项都填入此符号表内。 新表有一个指针指向刚好包围该嵌入过程的外围过程的符号表,由id表示的过程名字作为该外围过程的局部名字。 对图7.6处理变量说明的唯一修改是,要告诉enter在哪个符号表填入一项。编译原理第*页语义分析和中间代码产生 在下面的语义 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 中用到如下操作。(1)mktable(previous)创建一张新符号表,并返回指向新表的一个指针。参数previous指向一张先前创建的符号表,譬如刚好包围嵌入过程的外围过程符号表。指针previous之值放在新符号表表头,表头中还可存放一些其它信息如过程嵌套深度等等。我们也可以按过程被说明的顺序对过程编号,并把这一编号填入表头。(2)enter(table,name,type,offset)在指针table指示的符号表中为名字name建立一个新项,并把类型type、相对地址offset填入到该项中。(3)addwidth(table,width)在指针table指示的符号表表头中记录下该表中所有名字占用的总宽度。(4)enterpcoc(table,name,newtable)在指针table指示的符号表中为名字为name的过程建立一个新项。参数newtable指向过程name的符号表。编译原理第*页语义分析和中间代码产生 在下图中的翻译模式给出了如何在一遍扫描中对数据进行处理,它使用了一个栈tblptr保存各外层过程的符号表指针。 当处理过程partition中的说明语句时,栈tblprt中将包括指向sort,quicksortRpartition的符号表的指针。指向当前符号表的指针在栈顶。 另一个栈offset存放各嵌套过程的当前相对地址。offset的栈顶元素为当前被处理过程的下一个局部名字的相对地址。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生记录中的域名 除了基本类型、指针和数组外,下述产生式使非终结符号T产生记录类型:T→recordDend 当遇到保留字record时,与标记非终结符号L相应的语义动作为记录中的各域名创建一张新的记录符号表。把指向该表的指针压人栈tblptr中,并把相对地址。压入栈offset中。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生赋值语句的翻译 赋值语句中的表达式的类型可以是整型、实型、数组和记录。 作为翻译赋值语句为三地址代码的一个部分,将讨论如何在符号表中查找名字及如何存取数组和记录的元素。编译原理第*页语义分析和中间代码产生简单算术表达式及赋值语句 属性id.name表示id所代表的名字本身。 过程lookup(id.nam)检查是否在符号表中存在相应此名字的入口。如果有,则返回一个指向该表项的指针,否则,返回nil表示没有找到。 在语义动作中,调用过程emit将生成的三地址语句发送到输出文件中.编译原理第*页语义分析和中间代码产生 假定赋值语句出现在如下文法形成的上下文环境中:P→MDM→εD→D;D|id:T|procid;ND;SN→ε 如果把这些产生式加到下面文法中,非终结符P就变为开始符号。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生数组元素的引用 现在讨论包含数组元素的表达式和赋值句的翻译问题。 数组在存储器中的存放方式决定了数组元素的地址计算法,从而也决定了应该产生什么样的中间代码。编译原理第*页语义分析和中间代码产生 若数组A的元素存放在一片连续单元里,则可以较容易地访问数组的每个元素。假设数组A每个元素宽度为w,则A[i]这个元素的起始地址为base+(i-low)*w其中:low为数组下标的下界,base是分配给数组的相对地址,即base为A的第一个元素A[low]的相对地址。 变形整理得:i*w+(base一low*w) 其中子表达式C=base-low*w可以在处理数组说明时计算出来。 我们假定C值存放在符号表中数组A的对应项中,则A[i]相对地址可由i*w十C计算出来.编译原理第*页语义分析和中间代码产生 二维数组可以按行或按列存放。 若二维数组A按行存放,则可用如下公式计算A[il,i2]的相对地址:base+((i1-low1)*n2+i1-low2)*w 可以重写上述表达式为((i1*n2)+i2)*w+(base-((low1*n2)+low2)*w) 后一项子表达式(base-((low1*n2)+low*w2)*w)的值是可以在编译时确定的.编译原理第*页语义分析和中间代码产生 如果在文法中id出现的地方允许下面产生式中L出现,则可把数组元素引用加入到赋值语句中。L→id[Elist]|idElist→Elist,E|E 改写上述产生式为L→Elist]|idElist→Elist,E|id[E编译原理第*页语义分析和中间代码产生 Elist.ndim记录Elist中的下标表达式的个数,即维数。 函数limit(array,j)返回nj,即由array所指示的数组的第j维长度。最后Elist.place表示临时变量,用来临时存放由Elist中的下标表达式计算出来的值。 一个Elist可以产生一个k-维数组引用A[i1,i2,…,ik]的前m维下标,并将生成计算下面式子的三地址代码:(…((i1n2+i2)n3+i3)...)nm+im利用如下的递归公式进行计算:e1=i1,em=em-1*nm+im于是,当m=k时将ek乘以元素域宽w便可计算出式中的第一个子项。编译原理第*页语义分析和中间代码产生 下面考虑在赋值语句中加入数组元素之后的翻译模式,我们将把语义动作加入到如下文法中:(1)S→L:=E(2)E→E+E(3)E→(E)(4)E→L(5)L→Elist](6)L→id(7)Elist→Elist,E(8)Elist→id[E编译原理第*页语义分析和中间代码产生 在语义动作中由emit过程产生三地址代码。 若L是一个简单的名字,将生成一般的赋值; 否则,若L为数组元素引用,则生成对L所指示地址的索引赋值。编译原理第*页语义分析和中间代码产生 例:设A为一个10*20的数组,即n1=10,n2=20,并设w=4。对赋值语句x:=A[y,z]的带注释的语法分析树见图7.12.该赋值语句被翻译成如下三地址语句序列:T1:=y*20T1:=T1+zT2:=A-84T3:=4*T1T4:=T2[T3]X:=T4编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生布尔表达式的翻译 在程序设计语言中,布尔表达式有两个基本的作用:一个是用作计算逻辑值;另一个是用作控制流语句如if-then,if–then-else和while-do等之中的条件表达式。 布尔表达式是用布尔运算符号(and,or,not)作用到布尔变量或关系表达式上而组成的。 关系表达式形如E1relopE2,其中E1和E2是算术表达式,relop为关系运算符(<,<=,=,,>,>=)。 考虑由下列文法产生的布尔表达式:E→EorE|EandE|notE|(E)|idrelopid|id编译原理第*页语义分析和中间代码产生 计算布尔表达式的值通常有两种办法。 一是如同计算算术表达式一样,一步不差地从表达式各部分的值计算出整个表达式的值。 另一种计算法是采取某种优化 措施 《全国民用建筑工程设计技术措施》规划•建筑•景观全国民用建筑工程设计技术措施》规划•建筑•景观软件质量保证措施下载工地伤害及预防措施下载关于贯彻落实的具体措施 : 把AorB解释成ifAthentrueelseB 把AandB解释成ifAthenBelsefalse 把notA解释成ifAthenfalseelsetrue编译原理第*页语义分析和中间代码产生数值表示法 布尔表达式将从左到右按类似算术表达式的求值方法来计算。 例如,对于布尔表达式:aorbandnotc 将被翻译成如下三地址序列: T1:=notc T2:=bandT1 T3:=aorT2编译原理第*页语义分析和中间代码产生 一个形如a<b的关系表达式可等价地写成ifa<bthen1else0,并可将它翻译成如下三地址语句序列(我们假定语句序号从100开始): 100:ifa<bgoto103 101:T:=0 102:goto104 103:T:=1 104:编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生作为条件控制的布尔式翻译 出现在条件语句ifEthenS1elseSz2中的布尔表达式E,它的作用仅在于控制对S1和S2的选择。只要能够完成这一使命,E的值就无须最终保留在某个临时单元之中。 因此,作为转移条件的布尔式E,我们可以赋予它两种“出口”。一是“真”出口,出向S1;一是“假”出口,出向S2。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生 例7.3考虑如下表达式:a<borc<dande<f 假定整个表达式的真假出口已分别置为Ltrue和Lfalse,则按表7.7的定义将生成如下的代码:ifa<bgotoLtruegotoL1L1:ifc<dgotoL2gotoLfalseL2:ife<fgotoLtrungotoLfalse 自然,这里的代码是未优化的,有冗余的指令。编译原理第*页语义分析和中间代码产生 下面讨论如何通过一遍扫描来产生布尔表达式的代码。 为了便于讨论,我们假设下面在实现三地址代码时,采用四元式形式实现。 把四元式存入一个数组中,数组下标就代表四元式的标号。四元式(jnz,a,-,p)表示ifagotop四元式(jmp,x,y,p)表示ifxropygotop四元式(j,-,-,p)表示gotop编译原理第*页语义分析和中间代码产生 通过一遍扫描来产生布尔表达式和控制流语句的代码的主要问题在于,当生成某些转移语句时我们可能还不知道该语句将要转移到的标号究竟是什么。为了解决这个问题,我们可以在生成形式分支的跳转指令时暂时不确定跳转目标,而建立一个链表,把转向这个目标的跳转指令的标号键人这个链表。一旦目标确定之后再把它填人有关的跳转指令中。这种技术称为回填。编译原理第*页语义分析和中间代码产生 为非终结符E赋予两个综合属性E.truelist和E.falselist。 它们分别记录布尔表达式E所应的四元式中需回填“真”、“假”出口的四元式的标号所构成的链表。 具体实现时,我们可以借助于需要回填的跳转四元式的第四区段来构造这种链编译原理第*页语义分析和中间代码产生 (1)变量nextquad,它指向下一条将要产生但尚未形式的四元式的地址(标号)。nextquad的初值为1,每当执行一次emit之后,nextquad将自动增1. (2)函数makelist(i),它将创建一个仅含i的新链表,其中i是四元式数组的一个下标(标号);函数返回指向这个链的指针。 (3)函数merge(p1.p2),把以p1fnp2为链首的两条链合并为一,作为函数值,回送合并后的链首。 (4)过程backpatch(p,t),其功能是完成“回填”,把p所链接的每个四元式的第四区段都填为t.编译原理第*页语义分析和中间代码产生 现在,我们来构造一个翻译模式,使之能在自底向上的分析过程中生成布尔表达式的四元式代码。 我们在文法中插入了标记非终结符M,以便在适当的时候执行一个语义动作,记下下一个将要产生的四元式标号。我们使用的文法如下:(1)E→E1orME2(2)|E,1andME2(3)|notE1(4)|(E1)(5)|id1relopid2(6)|id(7)M→ε编译原理第*页语义分析和中间代码产生 例7.4重新考虑表达式a<borc<dande<f.一棵作了注释的分析树如图7.16所示。语义动作是在对树的深度优先遍历中完成的。由于所有的语义动作均出现在产生式的右端的终点,因而它们可以在自下而上的语法分析中随着对产生式的归约来完成。 按照上面所考虑的一些思想,构造出布尔表达式的翻译模式如下(如 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf P190)编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生 100(j<,a,b,0) 101(j,-,-,0) 102(j<,c,d,104) 103(j,-,-,0) 104(j<,e,f,0) 105(i,-,-,0) 100(j<,a,b,0) 101(j,-,-,102) 102(j<,c,d,104) 103(i,-,-,0) 104(i<,e,f,0) 105(i,-,-,0)编译原理第*页语义分析和中间代码产生控制语句的翻译 控制流语句 if-then,if–then-else,while-do 文法如下:S→ifEthenS1|ifEthenS1elseS2|whileEdoS1 其中E为布尔表达式。编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生编译原理第*页语义分析和中间代码产生 例7.5考虑如下语句whilea<bdoifc<dthenx:=y+zelsex:=y-z根据上述属性文法和赋值语句的翻译模式,将生成下列代码L1:ifa<bgotoL2gotoLnextL2:ifc<dgotoL3gotoL4L3:T1:=y+z;x:=T1gotoL1L4:T2:=y-zx:=T2gotoL1Lnext:编译原理第*页语义分析和中间代码产生 例7.6按照上述的语义动作,加上前述关于赋值句和布尔表达式的翻译法,语句while(a<b)doif(c<d)thenx:=y+z;将被翻译成如下的一串四元式:100(j<,a,b,102)101(j,-,-,107)102(j<,c,d,104)103(j,-,-,100)104(+,y,z,T)105(:=,T,-,x)106(j,-,-,100)107
本文档为【编译原理第7章】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
xxj7584
暂无简介~
格式:ppt
大小:531KB
软件:PowerPoint
页数:0
分类:建造师考试
上传时间:2020-03-22
浏览量:0