📄 7.6.1c.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.6.1b.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.6.1_2.htm'" ></td>
</tr>
</table>
<p><br>
<br>
<table>
<tr>
<td> </td>
<td class="content">truelist和falselist是非终结符号E的两个综合属性,用于生成布尔表达式的转移代码。因为当布尔表达式E的代码被生成时,其中的转移到“真”出口和转移到“假”出口的转移指令尚未完成,即这些指令的目标标号部分尚未填写。这些未完成的转移指令的标号分别放在由指针E.truelist和E.falselist所指向的表中。
<p>考虑图7.14中的产生式(1):E→ E<span class="down"><sub>1</sub></span> or
M E<span class="down"><sub>2</sub></span>。如果E<sub>1</sub>为真,
贝E也为真。如果E<span class="down"><sub>1</sub></span>为假,须进一步检测E<span
class="down">2</span>;若E<span class="down"><sub>2</sub></span>为真则E也为真,若E<sub>2</sub>为假则E为假。从而在E<span class="down"><sub>i</sub></span>.falselist所指向的表中所表示的那些转移指令的目标标号应为E<span
class="down"><sub>2</sub></span>的第一条语句的标号。这个目标标号是利用标记非终结符号M得到的。属性M.quad记录着E<span
class="down"><sub>2</sub></span> code(E<span class="down"><sub>2</sub></span>的代码)的第一条语句的标号。对产生式M→ε,我们有如下的语义动作:
</p>
<p>{M.quad:=nextquad}<br>
变量nextquad保存着下一条将产生的四元式的标号,即四元式数组的索引。该值在分析完产生式E→E<span
class="down"><sub>1</sub></span> or M E<span class="down"><sub>2</sub></span>以后用来回填到E<span
class="down"><sub>1</sub></span>。falselist所指向的表中的相应指令,即执行语义动作</p>
<p>{backpatch(E<span class="down"><sub>1</sub></span>.falselist,M.quad)}<br>
而产生式(1)的另一个语义动作 </p>
<p>{E.truelist: =merge(E<span class="down"><sub>1</sub></span>.truelist,E<span
class="down"><sub>2</sub></span>.truelist)}<br>
反映这样的事实:E<span class="down"><sub>1</sub></span>为真则E为真,E<span
class="down"><sub>2</sub></span>为真则E也为真。而语义动作</p>
<p>{E.falselist:=E<span class="down"><sub>2</sub></span>.falselist}<br>
表示在E<span class="down">1</span>为假的情况下控制才能到达E<span
class="down"><sub>2</sub></span>,这时,E<span class="down">2</span>的假出口作为E的假出口。产生式(2)的语义动作与此类似。
</p>
<p>产生式(5)的语义动作中将生成两条语句,一条是条件转移语句,另一条是无条件转移语句。它们的目标标号均未填写。其中第一条语句的标号放到新构建的由E.truelist指向的表中,第二条语句的标号放到新构建的由E.falselist指向的表中。
</p>
<p>其它产生式的语义动作在此不一一列举,下面的例题将给出一个较完整的说明。
</td>
</tr>
</table>
<p><br>
</p>
<table align="right" width="300">
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.6.1b.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.6.1_2.htm'" ></td>
</tr>
</table>
</body>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -