📄 5.2.4.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.2.3b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.2.4b.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>5.2.4 关于表达式的有向非循环图 </b></font>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
本节中我们将简单介绍关于表达式的有向非循环图(Directed
Acyclic Graph,简称dag)。它用于表达式中的公共子表达式的提取,以取得目标程序的局部优化。对于一个表达式的有向非循环图而言,它把该表达式的公共子表达式看作是等同的。一个有向非循环图与一棵语法树相同的地方是:对于表达式的每一个子表达式都有一个结点;一个内部结点表示一个运算符号并且它的子结点表示它的运算分量。不同的地方是:在一个有向非循环图中,表示一个公共子表达式的结点具有多于一个的父结点;然而在一棵语法树中,公共子表达式则被表示为重复的子树
</p>
</td>
</tr>
</table>
<table><tr><td>    </td>
<td class="content">
<p>
在5.2.3节我们已经介绍过利用函数mknode和mkleaf来建立语法树。只要我们对原有的操作稍加修改即可把它们用于表达式有向非循环图的建立。例如对于建立新的结点的函数mknode而言,只要在建立新结点之前去检查一下是否已存在一个相同的结点。若存在的话,函数mknode(op,left,right)
可以返回一个指针,此指针指向先前已构造好了的结点。建立叶结点的函数mkleaf可作类似的修改。
</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.2.3b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.2.4b.htm'"></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -