⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7.6.1c.htm

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 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>&nbsp;&nbsp;&nbsp;&nbsp;</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 + -