📄 7.6.1.htm
字号:
<html>
<head>
<title>编译原理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link type="text/css" rel="stylesheet" href="../css/specification.css">
</head>
<body>
<table align="right" width="300">
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.5.0.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.6.1b.htm'" ></td>
</tr>
</table>
<p><br>
<br>
<font class="title2"><b>7.6 回填</b></font> </p>
<table>
<tr>
<td> </td>
<td class="content"> 实现7.4节中的布尔表达式和控制流语句的语法制导定义的最容易的方法是经过两遍扫描。首先,从给定的输入构造出一棵语法树;然后,对语法树按深度优先遍历,来进行定义中给出的翻译。而本节我们要讨论如何通过一遍扫描来产生布尔表达式和控制流语句的代码。值得注意的是,这里所生成的翻译除了生成标号的方式以外,其余均与7.4节中的形式相同。
<p>通过一遍扫描来产生布尔表达式和控制流语句的代码的主要问题在于,当生成某些转移语句时我们可能还不知道该语句将要转移到的标号究竟是什么。为此,我们可以先产生暂时没有填写目标标号的转移指令。对于每一条这样的指令作适当的记录,一旦目标号被确定下来,再将它“回填”到相应的指令中。
</p>
<p>为了明确起见,这里的目标代码将来用四元式代码,并把它们置于一个四元式数组中。每一个四元式代码在数组中的位置用标号来表示,即标号将是数组的索引。
</td>
</tr>
</table>
<hr size="2" color="red" width="90%">
<font class="title2"><b>
<p>7.6.1 使用回填翻译布尔表达式</b></font> </p>
<table>
<tr>
<td> </td>
<td class="content">
现在,我们要构造一个翻译模式,使之适合于在自底向上的分析过程中生成布尔表达式的四元式代码。我们使用如下的布尔表达式文法:<br>
(1)E→E<span class="down"><sub>1</sub></span> or M E<span
class="down"><sub>2</sub></span><br>
(2) |E<span class="down"><sub>1</sub></span> and M E<span
class="down"><sub>2</sub></span><br>
(3) |not E<span class="down"><sub>1</sub></span><br>
(4) |(E<span class="down"><sub>1</sub></span>)<br>
(5) |id<span class="down"><sub>1</sub></span> relop id<span
class="down"><sub>2</sub></span><br>
(6) |true<br>
(7) |false<br>
(8) M→ε<br>
在文法中我们插入了标记非终结符号M ,插入的位置是在第(1)个产生式的or之后E<span
class="down"><sub>2</sub></span>之前、和在第(2)个产生式的and之后E<span
class="down"><sub>2</sub></span>之前。因为这些位置标志着表达式E<sub>2</sub>的目标代码的开始,是应安置标号的地方。即插入非终结符号M是为了引入一个语义动作,以便在适当的时候获得即将产生的下一个四元式的索引,或说四元式的标号。<br>
<br>
</td>
</tr>
</table>
<table align="right" width="300">
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.5.0.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.6.1b.htm'" ></td>
</tr>
</table>
</body>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -