四元式的地址(编号)作为B的语义值暂存起来,待到整个表达式的四元式产生完毕之后再来回填这个未填入的转移目标。
2.条件语句对条件语句ifeS1elseS2中的布尔表达式e,其作用仅在于控制对S1和S2的选择。因此,作为转移条件的布尔式e,我们可以赋予它两种“出口”:一是“真”出T口,出向S1;一是“假”出口,出向S2。于是,e的代码F条件语句可以翻译成如图的一般形式。
非终结符e具有两项语义值e_TC和e_FC,它们分别指出了尚待回填真、S2的代码假出口的四元式串。e的“真”出口只有在往回扫描到if时才能知道,而它图32条件语句的代码结构的“假”出口则需到处理过S1并且到达else才能明确。这就是说,必须把e_FC的值传下去,以便到达相应的else时才进行回填。另外,当S1语句执行完时意味着整个ifelse语句也已执行完毕;因此,在S1的编码之后应产生一条无条件转移指令。这条转移指令将导致程序控制离开整个ifelse语句。但是,在完成S2的翻译之前,这条无条件转移指令的转移目标是不知道的。甚至,在翻译完S2之后,这条转移指令的转移目标仍无法确定。这种情形是由于语句的嵌套性所引起的。例如下面的语句:ife1ife2S1elseS2elseS3在S1的代码之后的那条无条件转移指令不仅应跨越S2而且应跨越S3。这也就是说,转移目标的确定和语句所处的环境密切相关。
3.条件循环语句条件循环语句whileeS通常被翻译成图的代码结构。
f布尔式e的“真”出口出向S代码段的第一个四元式。紧接S代码段之后应产生一条转向测试e的无条件转移指令。e的“假”出口将导致程序控制离开整个while语句。e的“假”出口目标即使在整个while语句翻译完之后也未必明确。例如:ife1whilee2S1elseS2这种情况仍是由于语句的嵌套性引起的。所以,我们只好把它作为语句的语义值SCHAIN暂留下来,以便在处理外层语句时再伺机回填。
语法翻译实现方法将上述语法翻译付诸实现过程中,我们仅保留了算术表达式和布尔表达式翻译的文法和语义动
作;面对程序语句的翻译,由于改造后含有较多的非终结符且语义动作又相对简单,故仍恢复为改造之前的程序语句文法。由于总体上构造一个SLR分析表来实现语法分析及语义加工将使得所构造的SLR分析表过大,所以将其分为下面三部分处理:1对算术表达式单独处理,即为算术表达式构造一个SLR分析表,并将赋值语句AE与算术表达
式归为一类处理,处理之后的赋值语句仅看作为程序语句文法中的一个终结符a。2对布尔表达式也r