📄 7.3.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.3.2.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.3.2c.htm'" ></td>
</tr>
</table>
<p><br>
<br>
<table>
<tr>
<td> </td>
<td class="content">
<p>其中low<sub>1</sub>,low<sub>2</sub>分别为i<span
class="down"><sub>1</sub>,i<sub>2</sub>的下界(它们可以不等于1),n<span
class="down"><sub>2</sub>是i<sub>2</sub>可取值的个数。即若high<span
class="down"><sub>2</sub>为i<sub>2</sub>的上界,则n<span
class="down"><sub>2</sub>= high<sub>2</sub>-low<span
class="down"><sub>2</sub>+1。假定i<sub>1</sub>,i<span
class="down"><sub>2</sub>是编译时唯一尚未知道的值,我们可以重写上述表达式为:</p>
<p> ((i<sub>1</sub>*n<sub>2</sub>)+i<span
class="down"><sub>2</sub>)* w+(base-((low<sub>1</sub> *n<sub>2</sub>)+low<span
class="down"><sub>2</sub>)*w)<br>
(7.4) </p>
<p>最后一项子表达式是可以在编译时计算的。 </td>
</tr>
<tr>
<td></td>
<td class="content"></td>
</tr>
</table>
<table>
<tr>
<td> </td>
<td class="content">按行或按列存放方式可推广到多维数组.若多维数组A按行存放,则越往右边的下标变化越快,象自动计程仪显示数据一样.(7.4)式可推广成如下计算元素A[i<span
class="down"><sub>1</sub>,i<sub>2</sub>,...,i<span
class="down"><sub>k</sub>]的相对地址公式: <p> ((...((i<span
class="down"><sub>1</sub>*n<sub>2</sub>+i<span
class="down"><sub>2</sub>)*n<sub>3</sub>+i<span
class="down"><sub>3</sub> </span>)...)*n<sub>k</sub>+i<span
class="down"><sub>k</sub>)*w+<br>
base-((...((low<sub>1</sub>*n<sub>2</sub>+low<span
class="down"><sub>2</sub>)*n<sub>3</sub>+low<span
class="down"><sub>3</sub>...)*n<sub>k</sub>+low<span
class="down"><sub>k</sub>)*w<br>
(7.5) </td>
</tr>
</table>
<p>假定对任何j,n<sub>j</sub>=high<sub>j</sub>-low<span
class="down"><sub>j</sub>+1是确定的,则式(7.5)中的第二行的子表达式 </p>
<p> c=base-((...((low<sub>1</sub>n<span
class="down"><sub>2</sub>+low<sub>2</sub>)*n<span
class="down"><sub>3</sub>+low<sub>3</sub>)...)*n<span
class="down"><sub>k</sub>+low<sub>k</sub>) * w </p>
<p>可以在编译时计算出来并存放到符号表中数组A的表项里。至于按列存放方式,则最左边下标变化最快。
</p>
<table>
<tr>
<td> </td>
<td class="content">某些语言允许数组的长度在运行时刻一个过程被调用时动态地确定。有关这种数组在运行时栈中的分配情况,在6.3节中有简单的介绍。计算这种数组元素地址的公式与在固定长度数组情况下是同样的,只是上、下界在编译时是未知的。
<p>要生成有关数组引用的代码,其主要问题是把(7.5)式的计算与数组引用的文法联系起来。赋值语句中出现的数组的语法遵从如下L的产生式,其中id同图7.8的id:
</p>
<p>L→ <b>id</b> [Elist] | <b>id</b> </p>
<p>Elist→Elist,E|E </td>
</tr>
</table>
<table align="right" width="300">
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.3.2.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
onclick="vbscript:window.location.href='7.3.2c.htm'" ></td>
</tr>
</table>
</body>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -