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

📄 5.1.5.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='5.1.4b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.2.0.htm'"></img></td>
</tr>
</table>
<br><br>

<font class="title2"><b>5.1.5 计算顺序</b></font>


<table>
<tr>
<td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
一个有向非循环图的拓扑排序是图中结点的任何顺序m<sub>1</sub>,m<sub>2</sub>,…,m<sub>k</sub>,使得边必须是从序列中前面的结点指向后面的结点,也就是说,如果m<sub>i</sub>→m<sub>j</sub>是m<sub>i</sub>到m<sub>j</sub>的一条边,那么在序列中m<sub>i</sub>必须出现在m<sub>j</sub>之前。 
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
一个依赖图的任何拓扑排序都给出一个分析树中结点的语义规则计算的有效顺序。这就是说,在拓扑排序中,在一个结点上,语义规则b:=f(c<sub>1</sub>,c<sub>2</sub>,…,c<sub>k</sub>)中的属性c<sub>1</sub>,c<sub>2</sub>,…,c<sub>k</sub>,在计算b以前都是可用的。
</p>
</td></tr></table>



<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
语法制导定义说明的翻译可以是很精确的。最基本的文法用于建立输入符号串的分析树。依赖图如上面讨论的那样建立。从依赖图的拓扑排序中,我们可以得到计算语义规则的顺序。用这个顺序来计算语义规则就得到输入符号串的翻译。 
</p>
</td>
</tr>
</table>



<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
<b>例5.6</b> 在图5.5的依赖图中,每一条边都是从序号较低的结点指向序号较高的结点。因此,依赖图的一个拓扑排序可以从低序号到高序号顺序写出。从这个拓扑排序中我们可以得到下列程序,我们用a<sub>n</sub>来代表依赖图中与序号n的结点有关的属性: 
</p>
</td>
</tr>
</table>

<table>

<tr><td></td></tr>

<table align=center class=content>
<tr><td>a<sub>4</sub>:=real</td></tr>
<tr><td>a<sub>5</sub>:=a<sub>4</sub></td></tr>
<tr><td>addtype(id<sub>3</sub>.entry,a<sub>5</sub>)</td></tr> 
<tr><td>a<sub>7</sub>:=a<sub>5</sub></td></tr>
<tr><td>addtype(id<sub>2</sub>.entry,a<sub>7</sub>)</td></tr>            
<tr><td>a<sub>9</sub>:=a<sub>7</sub></td></tr>
<tr><td>addtype(id<sub>1</sub>.entry,a<sub>9</sub>)</td></tr>
</table>


<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
通过这些语义规则的计算,就把类型real存放到符号表中每一个标识符的类型项中。  
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
人们提出了一些计算语义规则的方法: 
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
<font class="emphasize">1.分析树法。</font>在编译时刻,这种方法从分析树所构成的依赖图的拓扑排序中得到一个计算顺序。但是,当所考虑的分析树的依赖图中含有回路的时候,这种方法就会失败。此时,这个语法制导定义称为是循环的。 
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
<font class="emphasize">2.基于规则的方法。</font>与产生式相联系的语义规则是在编译器构造时刻用手工或专门的工具来分析的。对于每一个产生式,计算产生式中属性值的顺序在编译器构造时刻是已预先确定了的。
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
<font class="emphasize">3.有些方法不考虑用语义规则来决定计算顺序。</font>例如,如果在分析过程中翻译,那么计算顺序由分析方法来确定而表面上与语义规则无关。
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
后两种方法在编译时刻不需要建立明确的依赖图,这样,使用这些方法可以更有效地利用编译空间和时间。
</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='5.1.4b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.2.0.htm'"></img></td>
</tr>
</table>

</BODY>

<html><script language="JavaScript">

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -