📄 7.2.2b.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.2.2.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.2.2c.htm'" ></td>
</tr>
</table>
<p><br>
<br>
<table>
<tr>
<td> </td>
<td class="content">
<p>为简化起见,我们假定对于(7.2)生成的语言的每一个过程都有一张独立的符号表。当碰到过程说明D→<b>proc
id;</b>D<sub>1</sub>;S 时,便创建一张新的符号表,并且把在D<sub>1</sub>中的所有说明语句中的表项都建在此符号表内。新表有一个指针指向刚好包围该嵌入过程的外围过程的符号表,由<b>id</b>表示的过程名字作为该外围过程的局部名字。例如,图7.5给出了分别对应五个过程的符号表,具体的程序见图6.18。过程readarray,exchange和quicksort的符号表有指针指向其外围过程sort的符号表。另一过程partition是在quicksort中被说明,从而它的符号表有指针指向quicksort的符号表。
</td>
</tr>
</table>
<table>
<tr>
<td> </td>
<td class="content">有关图7.6的语义规则定义中用到如下操作: <p>1.
mktable( previous)创建一张新符号表,并返回指向新表的一个指针。指针参数previous指向一张先前创建的符号表,譬如刚好包围嵌入过程的外围过程符号表。并将指针previous之值放在新符号表表头,表头中还可存放一些其它信息如过程嵌套深度等等。
</p>
<p>2:enter(table,name,type,offset)在指针table指示的符号表中插入名字为name,类型为type,相对地址为offset的新表项。
</p>
<p>3: addwidth(table,width)在指针table指示的符号表表头中记录下该表中所有名字占用的总域宽。
</p>
<p>4:enterproc(table,name, newtable)在指针table指示的符号表中为名字为name的过程建立一个新的表项。此表项中存放过程名字name和指向该过程符号表的指针newtable。
</p>
<p>在图7.6中的翻译模式使用了栈tblptr来存放指向各外围过程符号表的指针,从而可以形成一个存取数据的通路。如图7.5的符号表,当处理过程partition中的说明语句时,栈tblptr中将包括指向sort,quicksort,及partition的符号表的指针。而指向当前符号表的指针在栈顶。另外,栈offset存放各嵌套过程的当前相对地址,它是图7.5中offset的一般化。offset的栈顶元素为当前被处理过程的下一个局部名字的相对地址。
</td>
</tr>
</table>
<center>
<table>
<tr>
<td class="content" width=200 valign=top>
p→MD
</td>
<td>
{ addwidth(top(tblptr),top(offset)); <br>
pop(tblptr);pop(offset) } <br>
</td>
</tr>
<tr>
<td valign=top>
M→ε
</td>
<td>
{ t:=mktable(nil); <br>
push(t,tblptr);push(0,offset) } <br>
</td>
</tr>
<tr>
<td valign=top>
D→D<sub>1</sub>;D<sub>2</sub>
</td>
<td> </td>
</tr>
<tr>
<td valign=top>
D→<b>proc id</b>; N D<sub>1</sub>;S
</td>
<td>
{ t:=top(tblptr); <br>
addwidth(t,top(offset)); <br>
pop(tblptr);pop(offset); <br>
enterproc(top(tblptr),id.name,t) } <br>
</td>
</tr>
<tr>
<td valign=top>
D→id : T
</td>
<td>
{ enter(tblptr),id.name,T.type, top(offset)); <br>
top(offset):= top(offset)+T.width } <br>
</td>
</tr>
<tr>
<td valign=top>
N→ε
</td>
<td>
{ t:=mktable(top(tblptr)); <br>
push(t,tblptr);push(0,offset) }
</td>
</tr>
</table><br>
图7.6 处理嵌套过程中的说明语句
</center>
<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.2.2.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.2.2c.htm'" ></td>
</tr>
</table>
</body>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -