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

📄 5.2.4b.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='5.2.4.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.3.0.htm'"></img></td>
</tr>
</table>
<br><br>


<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
<b>例5.9 </b> 考虑表达式&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       
a+a*(b-c)+(b-c)*d&nbsp;<br>
利用上述方法构造出的相应的有向非循环图如下:
</p>
</td>
</tr>
</table>

<p align="center"><img src="images/5.2.4.gif"> </p>

<table><tr><td>&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td class="content">
<p>
图中叶结点a有两个父结点,因为a是两个子表达式a和a*(b-c)的公共子表达式。同样,b-c是两个子表达式a*(b-c)和(b-c)*d的公共子表达式,其相应结点也有两个父结点。上述有向非循环图是自底向上构造的,需要进行下面一系列的函数调用:
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
(1) p<span class="down"><sub>1</sub></span>:=mkleaf(<b>id</b>,a);<br> 
&nbsp;&nbsp;&nbsp; (2) p<span class="down"><sub>2</sub></span>:=mkleaf(<b>id</b>,a);<br> 
&nbsp;&nbsp;&nbsp; (3) p<span class="down"><sub>3</sub></span>:=mkleaf(<b>id</b>,b);<br> 
&nbsp;&nbsp;&nbsp; (4) p<span class="down"><sub>4</sub></span>:=mkleaf(<b>id</b>,c);<br> 
&nbsp;&nbsp;&nbsp; (5) p<span class="down"><sub>5</sub></span>:=mknode('-',p<span class="down"><sub>3</sub></span>,p<span class="down"><sub>4</sub></span>);<br> 
&nbsp;&nbsp;&nbsp; (6) p<span class="down"><sub>6</sub></span>:=mknode('*',p<span class="down"><sub>2</sub></span>,p<span class="down"><sub>5</sub></span>);<br> 
&nbsp;&nbsp;&nbsp; (7) p<span class="down"><sub>7</sub></span>:=mknode('+',p<span class="down"><sub>1</sub></span>,p<span class="down"><sub>6</sub></span>);<br> 
&nbsp;&nbsp;&nbsp; (8) p<span class="down"><sub>8</sub></span>:=mkleaf(<b>id</b>,b);<br> 
&nbsp;&nbsp;&nbsp; (9) p<span class="down"><sub>9</sub></span>:=mkleaf(<b>id</b>,c);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;(10) p<span class="down"><sub>10</sub></span>:=mknode('-',p<span class="down"><sub>8</sub></span>,p<span class="down"><sub>9</sub></span>);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;(11) p<span class="down"><sub>11</sub></span>:=mkleaf(<b>id</b>,d);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;(12) p<span class="down"><sub>12</sub></span>:=mknode('*',p<span class="down"><sub>10</sub></span>,p<span class="down"><sub>11</sub></span>);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;(13) p<span class="down"><sub>13</sub></span>:=mknode('+',p<span class="down"><sub>7</sub></span>,p<span class="down"><sub>12</sub></span>);<br> 
&nbsp;&nbsp;&nbsp; 
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>仅当需要时由mknode和mkleaf建立新的结点,如果与新的结点相同的结点已经存在,那么返回一个指针,此指针指向原有的结点。上述序列中的a,b,c和d都表示指针,并分别指向标识符a,b,c和d的符号表的表项。 
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>当重复调用第2行上的mkleaf(<b>id</b>,a)时,因为相同的调用已用第1行上的mkleaf(<b>id</b>,a)进行过了,因而无需建立新的叶结点只需返回指针p<span class="down"><sub>1</sub></span>,所以p<span class="down"><sub>l</sub></span>=p<span class="down"><sub>2</sub></span>。与此类似,在第8行和第9行上的调用将分别返回p<span class="down"><sub>3</sub></span>和p<span class="down"><sub>4</sub></span>。因此第10行和第5行是同样的,它们所要建立的结点是相同的。 
</p>
</td>
</tr>
</table>




<br>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.2.4.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.3.0.htm'"></img></td>
</tr>
</table>

</BODY>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -