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

📄 7.2.2b.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.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>&nbsp;&nbsp;&nbsp;&nbsp;</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>&nbsp;&nbsp;&nbsp;&nbsp;</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>       	
    	&nbsp;&nbsp;pop(tblptr);pop(offset) } <br>
    </td>
  </tr>
  <tr>
    <td  valign=top>
    	M→ε 
    </td>
    <td>
	{ t:=mktable(nil); <br>
	&nbsp;&nbsp;push(t,tblptr);push(0,offset) } <br>
    </td>
  </tr>
  <tr>
    <td  valign=top>	    
    	D→D<sub>1</sub>;D<sub>2</sub>
    </td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td valign=top>     
    	D→<b>proc id</b>; N D<sub>1</sub>;S
    </td>
    <td>
    	{ t:=top(tblptr); <br>
    	&nbsp;&nbsp;addwidth(t,top(offset)); <br>
	&nbsp;&nbsp;pop(tblptr);pop(offset); <br>
	&nbsp;&nbsp;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>
	&nbsp;&nbsp;top(offset):= top(offset)+T.width } <br>
    </td>
  </tr>
  <tr>
    <td  valign=top>  	    
    	N→ε
    </td>
    <td>
    	{ t:=mktable(top(tblptr)); <br>
	 &nbsp;&nbsp;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 + -