编译原理--03 语法制导翻译和中间代码生成复习(清华大学出版社第3版) (2)

逆波兰表示法即为后缀表示法,而默认我们使用的表达式是中缀表示法

程序设计语言中的表示 -----逆波兰表示-----
\(a+b\)   \(ab+\)  
\(-a\)   \(a@\)  
\(a+b*c\)   \(abc*+\)  
\((a+b)*c\)   \(ab+c*\)  
\(a:=b*c+b*d\)   \(abc*bd*+:=\)  
\(a:=b*(c+b)*(-d)\)   \(bcb+*d@*:=\)  

逆波兰式的使用:需使用额外的标识符栈。顺序扫描逆波兰表达式的时候,遇到标识符直接入栈。

遇到运算符时:

根据运算符目数,从栈顶取出相应数目的标识符做运算,并把运算结果压栈

运算结束时,标识符栈应该只剩下一个元素,且为运算结果

三元式表示

三元式\((op, A_1, A_2)\)

\(op\)为运算符
\(A_1\)为第一运算对象
\(A_2\)为第二运算对象

例如\(a:=b*c+b*d\)表示为:
\((1)\quad(*,b,c)\)
\((2)\quad(*,b,d)\)
\((3)\quad(+,(1),(2))\quad\) 这里用(1)和(2)来表示中间计算结果的显式引用
\((4)\quad(:=,(3),a)\quad\) 这里相当于\(a:=(3)\)

而单目运算的\(-b\)可以表示成\((-,b,/)\)

树形表示

树形表示和三元式表示非常相似,如\(a:=b*c+b*d\)表示为:

编译原理--03 语法制导翻译和中间代码生成复习(清华大学出版社第3版)


注意赋值表达式中被赋值对象在树的左孩子节点位置

单目运算\(-T_1\)直接表示成:

编译原理--03 语法制导翻译和中间代码生成复习(清华大学出版社第3版)

四元式(三地址码)表示

四元式\((op, A_1, A_2,R)\)

\(op\)为运算符
\(A_1\)为第一运算对象
\(A_2\)为第二运算对象
\(R\)为运算结果

例如\(a:=b*c+b*d\)的四元式表示:
\((1)\quad(*,b,c,t_1)\)
\((2)\quad(*,b,d,t_2)\)
\((3)\quad(+,t_1,t_2,t_3)\)
\((4)\quad(:=,t_3,-,a)\)

和三元式的差别在于,四元式对中间结果的引用必须通过给定的名字(临时变量)

它的三地址码写法为:
\(t_1:=b*c\)
\(t_2:=b*d\)
\(t_3:=t_1*t_2\)
\(a:=t_3\)

翻译 布尔表达式的翻译

布尔表达式在程序设计语言中有两个作用:

计算逻辑值

用于改变控制流语句中的条件表达式

控制流语句包含循环、分支两大类。

通常我们只考虑如下文法生成的布尔表达式:
\(E\rightarrow E\; and\; E\mid E\; or\; E\mid not\; E\mid id\; rop\; id\mid id\mid true\mid false\)
其中\(rop\)是关系符,如\(<=, <, =, >, >=\)
布尔运算符的优先顺序\(not>and>or\)
并且\(and\)\(not\)服从左结合

布尔表达式的计算有两种方法:

计算各部分的真假值,最后计算出整个表达式的值
\((1\;and\;0)\;and\;(0\;or\;1)=0\;and\;1=0\)

短路法:\(A\;and\;B\)如果\(A=0\)则直接得到\(0\)\(A\;or\;B\)如果\(A=1\)则直接得到1。这种方式若\(B\)为一个带返回值的过程调用会引发副作用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggjzx.html