📄 5.2.4b.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>    </td>
<td class="content">
<p>
<b>例5.9 </b> 考虑表达式 <br>
a+a*(b-c)+(b-c)*d <br>
利用上述方法构造出的相应的有向非循环图如下:
</p>
</td>
</tr>
</table>
<p align="center"><img src="images/5.2.4.gif"> </p>
<table><tr><td> </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>    </td>
<td class="content">
<p>
(1) p<span class="down"><sub>1</sub></span>:=mkleaf(<b>id</b>,a);<br>
(2) p<span class="down"><sub>2</sub></span>:=mkleaf(<b>id</b>,a);<br>
(3) p<span class="down"><sub>3</sub></span>:=mkleaf(<b>id</b>,b);<br>
(4) p<span class="down"><sub>4</sub></span>:=mkleaf(<b>id</b>,c);<br>
(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>
(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>
(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>
(8) p<span class="down"><sub>8</sub></span>:=mkleaf(<b>id</b>,b);<br>
(9) p<span class="down"><sub>9</sub></span>:=mkleaf(<b>id</b>,c);<br>
(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>
(11) p<span class="down"><sub>11</sub></span>:=mkleaf(<b>id</b>,d);<br>
(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>
(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>
</p>
</td>
</tr>
</table>
<table><tr><td>    </td>
<td class="content">
<p>仅当需要时由mknode和mkleaf建立新的结点,如果与新的结点相同的结点已经存在,那么返回一个指针,此指针指向原有的结点。上述序列中的a,b,c和d都表示指针,并分别指向标识符a,b,c和d的符号表的表项。
</p>
</td>
</tr>
</table>
<table><tr><td>    </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 + -