📄 7.2.1.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.1.5c.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.2.1b.htm'" ></td>
</tr>
</table>
<p><br>
<br>
<font class="title2"><b>7.2 说明语句</b></font> </p>
<table>
<tr>
<td> </td>
<td class="content">
<p>本节我们将讨论说明语句的翻译。当考察一个过程和分程序的说明语句时,便可为局部于该过程的名字分配存储空间。对每个局部名字,我们都将在符号表中建立相应的表项,并填写有关的信息,如类型,相对地址等。相对地址时指对静态数据区基址和活动记录中局部数据区基址的一个偏移值。应当指出,尽管中间代码形式是独立于目标机器的,但翻译说明语句时,为产生相对地址,是需要我们了解目标机器的。</p>
</td>
</tr>
</table>
<hr size="2" color="red" width="90%">
<font class="title2"><b>
<p>7.2.1 过程中的说明语句</b></font> </p>
<table>
<tr>
<td> </td>
<td class="content">
<p>在C,Pascal及Fortran等语言的语法中,允许在一个过程中的所有说明语句作为一个类集来处理。从而我们需要一个全程变量如offset来记录下一个可用的相对地址的位置。 <p>
<p>在图7.4关于说明语句的翻译模式中,非终结符号P产生一系列形如<b>
id</b> :T 的说明语句。在处理第一条说明语句之前,先置offset为0,以后每次遇到一个新的名字,便将该名字记入符号表中并置相对地址为当前offset之值,然后使offset加上该名字所表示的数据目标的域宽(即所占用的存储单元数)。
</td>
</tr>
</table>
<center>
<table align="center" width="483">
<tr>
<td width="153">P→</td>
<td width="316">{offset:=0} </td>
</tr>
<tr>
<td width="153"> D</td>
<td width="316"></td>
</tr>
<tr>
<td width="153">D→D;D</td>
<td width="316"></td>
</tr>
<tr>
<td width="153">D→<b>id</b>:T</td>
<td width="316">{enter(<b>id</b>.name,T.type,offset);</td>
</tr>
<tr>
<td width="153"></td>
<td width="316">offset:=offset+T.width} <br>
</td>
</tr>
<tr>
<td width="153">T→<b>integer</b></td>
<td width="316">{T.type :=integer;<br>
</td>
</tr>
<tr>
<td width="153"></td>
<td width="316">T.width:= 4}<br>
</td>
</tr>
<tr>
<td width="153">T→<b>real</b></td>
<td width="316">{T.type:=real;</td>
</tr>
<tr>
<td width="153"></td>
<td width="316">{T.width:=8}</td>
</tr>
<tr>
<td width="153">T→array[<b>num</b>]of T<sub>1</sub></td>
<td width="316">{T.type:=array(<b>num</b>.val,T<sub>1</sub>.type);</td>
</tr>
<tr>
<td width="153"></td>
<td width="316">T.width: =<b>num</b>.val *T<sub>1</sub>.width}</td>
</tr>
<tr>
<td width="153">T→↑T<sub>1</sub> </td>
<td width="316">{T.type:=pointer(T<sub>1</sub>.type);</td>
</tr>
<tr>
<td width="153"></td>
<td width="316">T.width := 4} </td>
</tr>
</table>
<br><br>
图7.4 计算说明语句中名字的类型和相对地址
</center>
<table align="right" width="300">
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.1.5c.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.2.1b.htm'" ></td>
</tr>
</table>
</body>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -