)室此不难明白,语法制导译的关键,是 为每个产生式些相应的翻译子程序了。例子中 的 print产生式序号这种语义子程序只能输出这 个数字串。现在,对一个有穷表示的文法的无 穷多个语句,按所给出的语义子程序要完成不 同语句的翻译任务,输出各自的目标代码。难 点自然就集中在如何写这些语义子程序了。这 章自§5.3起,将花大部分篇幅来讨论各种 语句的翻译方案该如何写
11 (3) 至此不难明白,语法制导翻译的关键,是 为每个产生式些相应的翻译子程序了。例子中 的print产生式序号这种语义子程序只能输出这 个数字串。现在,对一个有穷表示的文法的无 穷多个语句,按所给出的语义子程序要完成不 同语句的翻译任务,输出各自的目标代码。难 点自然就集中在如何写这些语义子程序了。这 一章自§5.3起,将花大部分篇幅来讨论各种 语句的翻译方案该如何写
§52中间语言 后缀式表示 也称逆波兰表示,是由波兰数学家卢卡西维奇 ( Lukasiewicz提出的。它是将aopb中运算量a、b依次写 在算符op之前,即abop,我们可以形式地给出表达式E的 后缀表示的递归定义 1)如果E是变量或常数,则E的后缀表示即E本身。 (2)如果E为E1opE2形式,则它的后缀表示为E1E2 op,其中op是二元算符,E1,E2分别是E的后缀表示(op 为一元运算时视E1、E1为空)。 (3)如果E为(E1)形式,则E1后缀表示即为E的后缀表示。 例如(a*b+c)-d的后缀表示 a minus b*c+d-其中 minus表 示一元运算 12
12 §5.2 中间语言 一、后缀式表示 也称逆波兰表示,是由波兰数学家卢卡西维奇 (Lukasiewicz)提出的。它是将a op b中运算量a、b依次写 在算符op之前,即a b op,我们可以形式地给出表达式E的 后缀表示的递归定义: (1) 如果E是变量或常数,则E的后缀表示即E本身。 (2) 如果E为E1 op E2形式,则它的后缀表示为E1’ E2’ op,其中op是二元算符,E1’,E2’分别是E的后缀表示(op 为一元运算时视E1、E1’为空)。 (3) 如果E为(E1)形式,则E1后缀表示即为E的后缀表示。 例如(-a*b+c)-d的后缀表示a uminus b*c+d-其中uminus表 示一元运算“=
三、三地址代码 三地址代码其语句一般形式为: X.y op Z 三地址代码便是这样的语句序列,其中x、y和z为 名字、常量或编译时产生的临时变量,op为运算符如定 点算符,浮点算符,逻辑算符等。由于三地址语句只含 个运算符,故多个算符组成的表达式必须用三地址语 句序列表示。例如表达式x+y*z的三地址代码为: e-y Z 2:=x+t1 其中:t1和t是编译时需要的临时变量。 地址语句通常包含三个地址,两个用来存放运算对象, 个用来存放运算结果。在实际实现时,用户定义的名 字将由指向符号表中该名字项的指针所代替。 13
13 三、三地址代码 三地址代码其语句一般形式为: x:=y op z 三地址代码便是这样的语句序列,其中x、y和z为 名字、常量或编译时产生的临时变量,op为运算符如定 点算符,浮点算符,逻辑算符等。由于三地址语句只含 一个运算符,故多个算符组成的表达式必须用三地址语 句序列表示。例如表达式x+y*z的三地址代码为: t1:=y*z t2:=x+t1 其中:t1和t2是编译时需要的临时变量。 三地址语句通常包含三个地址,两个用来存放运算对象, 一个用来存放运算结果。在实际实现时,用户定义的名 字将由指向符号表中该名字项的指针所代替
tl:=-c tl:=-c t2:=b*t1 t2:=b*t1 t3:=-c t3:=t2*t2 t4: =bt1 a:=t5 f5:=t2*t4 图56三地址代码 14
14 t1:=-c t1:=-c t2:=b*t1 t2:=b*t1 t3:=-c t3:=t2*t2 t4:=b*t1 a:=t5 t5:=t2*t4 a:=t5 (a) (b) 图5.6 三地址代码
四、三地址语句的种类 作为中间语言的三地址语句很类似于汇编代码,语句可以 有符号标号,有各种控制流语句,本书中常用的三地址语 句有以下几种: )x:=yopz形式的赋值语句,其中op为二目的算术运算 符或逻辑运算符。 (2)x:=0py形式的赋值语句,其中op为一目运算符,如 目减 minus,逻辑否定not,移位算符及将定点数转换成 浮点数的类型转换符 (3)x:=y形式的复写语句,将y的值赋给x。 (4)无条件转移语句g0toL下一个将被执行的语句是标号为 L的语句 15
15 四、三地址语句的种类 作为中间语言的三地址语句很类似于汇编代码,语句可以 有符号标号,有各种控制流语句,本书中常用的三地址语 句有以下几种: (1) x:=y op z形式的赋值语句,其中op为二目的算术运算 符或逻辑运算符。 (2) x:=op y形式的赋值语句,其中op为一目运算符,如一 目减uminus,逻辑否定not,移位算符及将定点数转换成 浮点数的类型转换符。 (3) x:=y形式的复写语句,将y的值赋给x。 (4) 无条件转移语句goto L下一个将被执行的语句是标号为 L的语句