对于条件语句: E then s1,ese,S2可以考虑三目运 算符,如ES1S2f但这种表示方法当执行到运算符i时,E S1、S2三个运算对象已经全部计算过可或执行了,由于构造 的逆波兰式都是从左到右执行的,此时很难再回到前面去重 新执行或跳过相应的逆波兰式。为此可以用二目条件转移来 表 Esop S1<op2jmpS2,其中 ≤op 、<op2>分别 天S2的开始位置和跟在之后那个号的位置。利mp分 别为条件和无条件转运算符。类似可以引进条件转移的逆波 <运算对象1><运算对象2<运算符> 其中<运算对象1>是算术值或逻辑值,<运算对象2>是逆波兰 的某个编号或位置;<运算符>可以是、j、je、ige、j、 jnz等,分别表示小于、大于、小于等于、大于、等于、不等 于等转移的运算符
对于条件语句:if E then S1 else S2 可以考虑三目运 算符if,如ES1S2 if。但这种表示方法当执行到运算符if时,E、 S1、S2三个运算对象已经全部计算过可或执行了,由于构造 的逆波兰式都是从左到右执行的,此时很难再回到前面去重 新执行或跳过相应的逆波兰式。为此可以用二目条件转移来 表示:E<op1>jz S1<op2>jmpS2,其中,<op1>、<op2>分别 为S2的开始位置和跟在S2之后那个符号的位置。jz和jmp分 别为条件和无条件转运算符。类似可以引进条件转移的逆波 兰式为: <运算对象1> <运算对象2><运算符> 其中<运算对象1>是算术值或逻辑值,<运算对象2>是逆波兰 的某个编号或位置;<运算符>可以是jl、jg、jle、jge、jz、 jnz等,分别表示小于、大于、小于等于、大于、等于、不等 于等转移的运算符
当然用同样的方式,还可以将逆波兰式扩充至数组、记录或 其它数据类型,也可将fo语句、 While语句、case语句扩充 至逆波兰式。另外需要指出的是:赋值运算符和其它逆波兰 式不一样,它要把<表达式>的值放入<变量>,在栈中只需要 变量的地址,而不是值,计算赋值运算符后不要将结果入栈 例:写出语句ia> b and b< c then x:=5+3d/4 else y:=6y8 相应的逆波兰式。 12345678910111213141516171819 a b>bc< and 21 jz x53 d *4 /+:=28 202122232425262728 jmp y 6 y 8
当然用同样的方式,还可以将逆波兰式扩充至数组、记录或 其它数据类型,也可将for语句、while语句、case语句扩充 至逆波兰式。另外需要指出的是:赋值运算符和其它逆波兰 式不一样,它要把<表达式>的值放入<变量>,在栈中只需要 变量的地址,而不是值,计算赋值运算符后不要将结果入栈。 例:写出语句 if a>b and b<c then x:=5+3*d/4 else y:=6-y*8 相应的逆波兰式。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 a b > b c < and 21 jz x 5 3 d * 4 / + := 28 20 21 22 23 24 25 26 27 28 jmp y 6 y 8 * - :=
6.1.2三元式和树 中间代码的另一种表示法为三元式,三元式的形式为 (<运算符>,<运算对象1,<运算对象2>) 其中:<运算对象1><运算对象2>分别表示变量、常量或三元 式的结果等。 例如,表达式a+(-b*c+d)e的三元式序列为: 运算符运算对象运算对象 (2)( (3)(+,(2),d ))) (4)(*,(3) (5)(+ a 其中:(1)、(2)、(3)、(4)分别为第1、第2、第3、 第4条三元式的结果。整个表达式的结果可用(5)表示
6.1.2 三元式和树 中间代码的另一种表示法为三元式,三元式的形式为: ( <运算符>, <运算对象1>, <运算对象2> ) 其中:<运算对象1> <运算对象2>分别表示变量、常量或三元 式的结果等。 例如,表达式a+(-b*c+d)*e的三元式序列为: 运算符 运算对象 运算对象 (1)( - , b , _ ) (2)( * , (1) , c ) (3)( + , (2) , d ) (4)( * , (3) , e ) (5)( + , a , (4) ) 其中:(1)、(2)、(3)、(4)分别为第1、第2、第3、 第4条三元式的结果。整个表达式的结果可用(5)表示
下面把三元式扩充到其它表示 〔imp,,p)表示无条件转向第p条三元式执行 表示当a小于0时转向第p条三元式执行,否则执行 三元式 9ap),表示当a大于0时转向第p条三元式执行,否则执 行下一条三元式 ile, a 执 侣下 表示当a小于等于0时转向第p条三元式执行,否 条三元式 好得一素至大于等于0时转向第D条三元式行,否 华已 表示当a等于0时转向第p条三元式执行,否则执行 三元式 (nz 表示当a不等于0时转向第p条三元式执行,否则 为行 条三元式
下面把三元式扩充到其它表示。 (jmp,_,p) 表示无条件转向第p条三元式执行 (jl,a,p) 表示当a小于0时转向第p条三元式执行,否则执行 下一条三元式 (jg,a,p) 表示当a大于0时转向第p条三元式执行,否则执 行下一条三元式 (jle,a,p) 表示当a小于等于0时转向第p条三元式执行,否 则执行下一条三元式 (jge,a,p) 表示当a大于等于0时转向第p条三元式执行,否 则执行下一条三元式 (jz,a,p) 表示当a等于0时转向第p条三元式执行,否则执行 下一条三元式 (jnz,a,p) 表示当a不等于0时转向第p条三元式执行,否则 执行下一条三元式
下面介绍用树来表示算术表达式。用树来表示中间代 码需要用两个指针分别指向它的左子树和右子树。如果e1 和e2是表达式,其相应的树用T1和T2表示,则e1+e2、e e2、e1e2、e1e2和-e1的树如图 T T2 T, T x e
下面介绍用树来表示算术表达式。用树来表示中间代 码需要用两个指针分别指向它的左子树和右子树。如果e1 和e2是表达式,其相应的树用T1和T2表示,则e1+e2、e1 - e2、e1*e2、e1 /e2和-e1的树如图