📄 6.1.3.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='6.1.2b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.1.4.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>6.1.3控制栈 </b></font>
<table><tr><td>    </td>
<td class="content">
<p>
程序中的控制流对应于从根开始按深度优先的顺序周游活动树,访问一个结点先于其子结点,并在每一结点处按从左到右的顺序递归地访问各个子结点,这样,图6.2的输出可以通过周游图6.3的活动树来重新构造,当第一次到达代表一个活动的结点时打印enter,并在周游中当此结点的整个子树被访问完以后打印leave。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
我们可以使用一个称为<B>控制栈</B>的栈来保存过程活动的生存踪迹。这一思想是,当一个活动开始时把代表此活动的结点推入控制栈中,并在此活动结束时把此结点从控制栈中弹出。控制栈的内容与到达活动树的根结点的路径有关。当结点n位于栈顶时,栈中包含从n到根的路径上的那些结点。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
<B>例6.2</B> 图6.4表示的是,在图6.3中的活动树当控制进入q(2,3)代表的活动时曾到达过的结点。标有r,p(1,9),p(1,3)和q(1,0)的活动已经执行完,因此图中包含连到这些结点的虚线。图中的实线标出了从q(2,3)到根的路径。
</td></tr></table>
<br>
<center><img src="images/6_4.gif"></center><br>
<table><tr><td>    </td>
<td class="content">
<p>
在这一点上控制栈中包括下面通向根的路径上的结点(栈顶的内容在最右边):
<BR> s,q(1,9),q(1,3),q(2,3)
<BR>并且除此之外没有其他结点。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
控制栈可扩充用来实现如Pascal语言的栈式存储分配技术。这种技术将在第6.3和6.4节中详细讨论。
</td></tr></table>
<table>
<tr>
<td><font class="yanshi">     观看演示 </font></td>
<td><font color=blue onmouseover="javascript:style.cursor='hand'" onclick="javascript:open('applets/test6_2/Page1.htm','_blank','menu=no,toolbar=no,location=no,directories=no,status=no,scrollbars=yes,resizable=yes,copyhistory=no,left=100,top=100,width=800,height=600')">控制栈演示</font></td>
<td><img src="../images/yanshi.gif"></img></td>
<br>
<p>
</tr>
</table>
<!--hr size=2 color=red width=90%>
<br>
<font class="title2"><b>附录:动态链</b></font>
<br>
<table><tr><td>    </td>
<td class="content">
<p>我们可以用动态链描述程序的执行过程。如果用P<span class="down"><sub>0</span></sub>表示主程序的活动,其定义如下:
<br>
1.P<sub>0</sub>是一个动态链;
<br>
2.设P<sub>0</sub>,P<sub>1</sub>,...,P<sub>n</sub>是一个动态链,如果活动P<sub>n</sub>中由于过程调用而进入活动P<sub>n+1</sub>,那么P<sub>0</sub>,P<sub>1</sub>,...,P<sub>n</sub>,P<sub>n+1</sub>也是一条动态链。动态链中每个活动都处于执行的过程中,但仅有一个,即动态链的最后一个活动正处于现役状态(当前正在工作),而其它活动正等待现役活动的完成。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
设P<sub>0</sub>,P<sub>1</sub>,....P<sub>n</sub>是当前的动态链,根据定义,P<sub>n</sub>是现役活动。如果在P<sub>n</sub>中控制进入活动P<sub>n+1</sub>,则动态链变成:P<sub>0</sub>,P<sub>1</sub> ,....,P<sub>n</sub>,P<sub>n+1</sub>。且P<sub>n+1</sub>成为现役活动;若P<sub>n</sub>正常结束,则动态链变成:P<sub>0</sub>,P<sub>1</sub> ,...,P<sub>n-1</sub>。这样,P<sub>n-1</sub>再次成为现役活动。若在P<sub>n</sub>中有goto语句跳到某一外过程而进入活动P<sub>r</sub>,则动态链将退缩为P<sub>0</sub>,P<sub>1</sub> ,...,P<sub>r</sub>且P<sub>r</sub>成为现役活动。显然,例2中形成的动态链是s,q(1,9),q(1,3),q(2,3)。 q(2,3)是现役活动。 栈中内容恰好是当前的动态链,而现役活动总是在栈顶。
</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='6.1.2b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.1.4.htm'"></img></td>
</tr>
</table>
</BODY>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -