最新【考研计算机专业课】天津大学 编译原理讲义 中间代码表示法5.2(共33张PPT课件).pptx
《最新【考研计算机专业课】天津大学 编译原理讲义 中间代码表示法5.2(共33张PPT课件).pptx》由会员分享,可在线阅读,更多相关《最新【考研计算机专业课】天津大学 编译原理讲义 中间代码表示法5.2(共33张PPT课件).pptx(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、5.2 中间代码表示法中间代码表示法5.2.1 逆波兰逆波兰(b ln)表示法表示法 逆波兰表示法逆波兰表示法是一种在不使用括号的情况是一种在不使用括号的情况(qngkung)下无二义的说下无二义的说明算术表达式的一种方法。明算术表达式的一种方法。 这种表示法是把运算量这种表示法是把运算量 (操作数操作数) 写在前面写在前面(qin mian),把算符写在后面,把算符写在后面(后缀后缀)。 例例,把,把a+b写成写成ab+ 把把a+(b*c)写成写成abc*+ 扩展扩展: 一般而言,若一般而言,若是一个是一个k ( 1 ) 目算符,它对运算量目算符,它对运算量 e1, e2, , ek 作用的
2、结果将被表示成作用的结果将被表示成e1e2ek。 第一页,共三十三页。这种表示表达式的方法称为这种表示表达式的方法称为(chn wi)后缀式后缀式。 ab+ 把双目运算符放在两个把双目运算符放在两个(lin )运算量的中间的运算量的中间的中缀表示法中缀表示法。 a+b 把运算符放在其运算量前面把运算符放在其运算量前面(qin mian)的的前缀表示法前缀表示法。 +ab共同的特点是共同的特点是:1. 操作符的个数不变操作符的个数不变 2. 操作数的次序和个数不变操作数的次序和个数不变 逆波兰表示法还具有两个明显的优点逆波兰表示法还具有两个明显的优点: 1. 无括号,形式简洁清楚无括号,形式简洁
3、清楚 2. 操作符的顺序与运算的次序完全相同操作符的顺序与运算的次序完全相同 第二页,共三十三页。1. 一般表达式一般表达式 (中缀式中缀式) 转化成逆波兰转化成逆波兰(b ln)式式(后缀式后缀式)(1) 从整体到局部从整体到局部(jb)的方法的方法 设设e是给定表达式,是给定表达式,是相应的逆波兰式是相应的逆波兰式 则则 = = = a 其中其中: 运算量运算量 a 变量变量 (暂只考虑简单变量,常数暂只考虑简单变量,常数) 第三页,共三十三页。例例, = = *= *= a*cd*= ab*+*cd*= 例例, = = *= ab*cd*= a+*cd*= abcd*+*cd*第四页,共
4、三十三页。(2) 自左向右扫描自左向右扫描(somio)(somio)的方法的方法 将表达式中的所有将表达式中的所有(suyu)(suyu)变量按原顺序排列。变量按原顺序排列。 设有子表达式设有子表达式e1e2,则称,则称e2的后继符为的后继符为(运算符运算符) 的分界符,把每的分界符,把每个运算符移到相应的分界符处,并去掉括号个运算符移到相应的分界符处,并去掉括号;若一个符号是多个运算符的若一个符号是多个运算符的分界符,则按分界符,则按“后者先移后者先移”的原则的原则(yunz)(yunz)进行。进行。 例例: : a * ( (b+c) ) 逆波兰式逆波兰式 abc+ abc+* 例例:
5、: a * (b * c d ) e 逆波兰式逆波兰式 abc abc*d-d-*e-e- 第五页,共三十三页。从左向右扫描从左向右扫描,先遇到,先遇到+双目运算双目运算,完成完成a+b运算,再遇到运算,再遇到*双目运算,完成双目运算,完成(a+b)*c运算运算,从而从而(cng r)(cng r)得到分解得到分解 (a+b)*c 。 例例,ab+c* =分解分解(fnji)(fnji)= (a+b)*c 从右向左扫描从右向左扫描(somio)(somio),先遇到,先遇到*双目运算双目运算,它的左侧应有两个运算量,它的左侧应有两个运算量,首先是首先是c是一个简单变量,它是参加运算的第二个运算
6、量。再向左遇是一个简单变量,它是参加运算的第二个运算量。再向左遇到到+双目运算,说明参加双目运算,说明参加* 运算的第一个运算量应是运算的第一个运算量应是+运算运算的结果,然后再对的结果,然后再对+运算实施分解。运算实施分解。 使用后缀式,可以根据运算量和运算符出现的先后位置,以及每个算符的目使用后缀式,可以根据运算量和运算符出现的先后位置,以及每个算符的目数就完全决定了一个表达式的数就完全决定了一个表达式的分解分解。 第六页,共三十三页。2. 后缀后缀(huzhu)(huzhu)式的计值式的计值 表达式的后缀表示表达式的后缀表示,可以,可以使用使用(shyng)(shyng)一个栈一个栈 来
7、计算它的值。来计算它的值。 计算过程计算过程: : 自左向右扫描后缀自左向右扫描后缀(huzhu)(huzhu)式,每逢遇到运算量就令其式,每逢遇到运算量就令其入栈;入栈; 遇到遇到K目运算符,则将它作用于栈顶的目运算符,则将它作用于栈顶的K个项,并用运算结个项,并用运算结果代替这果代替这K个项。个项。 例例,ab+c* 的计值过程如下的计值过程如下: :1. 遇遇a,a入栈。入栈。 2. 遇遇b, b入栈。入栈。 3. 遇遇+,将栈顶两项相加将栈顶两项相加,移走,移走b、a,把和把和E1置于栈顶。置于栈顶。 4. 遇遇c, c入栈。入栈。 5. 遇遇*,将栈顶两项相乘将栈顶两项相乘,移走移走
8、c、E1,把积把积E2置于栈顶置于栈顶。第七页,共三十三页。栈栈当前输入符当前输入符后缀式后缀式空空aab+c*ab bb+c*ab+ +c*E1 cc*E1c*E2第八页,共三十三页。3. 后缀后缀(huzhu)(huzhu)式的推广式的推广 我们可以将后缀式简单我们可以将后缀式简单(jindn)(jindn)的推广到比表达式更大的范围。的推广到比表达式更大的范围。 例例,如下的条件算术表达式,如下的条件算术表达式:e ? x : y表示若表示若e0,则此式值为,则此式值为x;否则,为否则,为y。 若把若把e ? x : y表示成表示成一个三目运算一个三目运算exy,这种方式出现的,这种方式
9、出现的问题问题是是: : 任何任何情况下,第二目情况下,第二目x和第三目和第三目y均得计算一次,会造成时间均得计算一次,会造成时间(shjin)(shjin)的浪费。的浪费。 克服它的一种可行办法是克服它的一种可行办法是引进标号引进标号, 条件转移和无条件转移算符条件转移和无条件转移算符。 第九页,共三十三页。令后缀式存放在令后缀式存放在一维数组一维数组 POST1:n 中,每个数组元素中,每个数组元素(yun s)(yun s)存存放一个运算量或运算符或标号。放一个运算量或运算符或标号。 所引进的标号是一个所引进的标号是一个(y )(y )下标,指向数组的某元素。下标,指向数组的某元素。 无
10、条件转移无条件转移(zhuny)(zhuny) j,如如 p j 表示表示: : 转移到转移到 POSTp (单目算符单目算符) 。 条件转移条件转移 j( (小于转移算符小于转移算符) ),如,如 e1 e2 p j表示表示: 若若e1小于小于e2,则转移,则转移到到POSTp (三目算符三目算符)。 jez( (0转移算符转移算符) ),如,如 e p jez表示表示: : 若若e等于等于false,则转移到则转移到 POSTp (双双目算符目算符)。 jnz( (非非0转移算符转移算符) ),如,如 e p jnz表示表示: : 若若e不不等于等于false,则转移到则转移到 POSTp
11、 (双目算符双目算符)。 第十页,共三十三页。用后缀式来表示各种用后缀式来表示各种( zhn)( zhn)语句。语句。 (1) 赋值语句赋值语句(yj)(yj)的逆波兰式的逆波兰式 赋值语句赋值语句(yj)(yj) x := e 逆波兰式逆波兰式 := (2) 转移语句的逆波兰式转移语句的逆波兰式 转移语句转移语句 goto L,其中其中L是标号。是标号。 逆波兰式逆波兰式 L j,其中其中 j是单目算符,转向标号处。是单目算符,转向标号处。 第十一页,共三十三页。(3) 条件条件(tiojin)(tiojin)语句的逆波兰式语句的逆波兰式 条件条件(tiojin)(tiojin)语句语句:
12、if e then x else y 逆波兰逆波兰(b ln)(b ln)式式: e p1 jez x p2 j p1: y p2: 其中,后跟冒号的标号并不真正出现在后缀式中,它们仅仅在书面上其中,后跟冒号的标号并不真正出现在后缀式中,它们仅仅在书面上指明有关式子的开始位置。指明有关式子的开始位置。 在在POST中出现的后缀式将是中出现的后缀式将是: : ep1jezxp2jyp1p2第十二页,共三十三页。例例: if ab then x:=a+b else y:=a-b 逆波兰式表示为逆波兰式表示为: abi+j then k:=k- -1;goto 10 beginendelse k:=
13、i*i - - j*j; i:=0;j:=0;beginend逆波兰逆波兰(b ln)(b ln)表示为表示为: :(2) k 100 := (3) k i j + jez (0转转) (4) k k 1 - - := (6) k i i * j j * - - := (7) i 0 := (1) block (9) blockend (8) j 0 := (3) k i j + 6 jez (0转转) (5) 3 j第十三页,共三十三页。(4) 循环语句的逆波兰循环语句的逆波兰(b ln)(b ln)表示表示 循环语句循环语句(yj)(yj): :for (i=a;ib;i+) s ,先将其
14、变成等价的条,先将其变成等价的条件语句件语句: : i:=a;10: if i=b thenbegins;i:=i+1;goto 10 end然后然后(rnhu)(rnhu)按条件语句形式转换。按条件语句形式转换。 第十四页,共三十三页。例例,循环,循环(xnhun)(xnhun)语句语句 for (i=1;i=100;i+) s=s+i; 先展成等价的条件语句先展成等价的条件语句: : i:=1;10: if i=100 then begins:=s+i;i:=i+1;goto 10 end然后转换成逆波兰式然后转换成逆波兰式: : (1) i 1 := (4) i 100 = 21 jez
15、 (9) s s i + := (14) i i 1 + := (19) 4 j (21)第十五页,共三十三页。4. 语法语法(yf)(yf)制导生成后缀式制导生成后缀式 原理性描述原理性描述(mio sh)如下如下: 产生产生(chnshng)式式 语义动作语义动作 (1) EE(1)op E(2) E.CODE = E(1).CODEE(2).CODEop (2) E( E(1)) E.CODE = E(1).CODE (3) E i E.CODE = i 其中其中: : E.CODE后缀式符号串后缀式符号串 “捻接捻接”操作操作 i 标识符标识符 (如如a 或或b或或c ) 第十六页,共
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 考研计算机专业课 最新【考研计算机专业课】天津大学 编译原理讲义 中间代码表示法5.2共33张PPT课件 最新 考研 计算机 专业课 天津大学 编译 原理 讲义 中间 代码 表示 5.2 33 PPT
链接地址:https://www.taowenge.com/p-24523029.html
限制150内