📄 4.6.3.0.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='4.6.2.0b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.6.3.0b.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>4.6.3 优先函数</b></font>
<table><tr><td> </td>
<td class="content">
<p>在实现算符优先分析算法时,为了节约存储空间和便于执行比较运算,常常不用优先关系表而是用两个优先函数f和g。这是两个从终结符号映射到整数的函数,我们希望对于符号a和b选择f和g,使之满足:<br>
1.当a<·b时,f(a)<g(b);<br>
2. 当a<img src="images/equalpoint.gif" width="20" height="19">b时,f(a)= g(b);<br>
3. 当a·>b时,f(a)>g(b)。<br>
于是a和b之间的优先关系可以由比较f(a)与g(b)的大小来决定。然而在优先关系表中那些错误入口会带来一些麻烦,因为不管f(a)和g(b)是什么值,三个关系中必有一个成立,因而错误检测能力损失,这会掩盖输入符号串的某些错误。但是我们可以通过检查栈顶符号θ和输入符号a的具体内容来发现原来那些不可比较的情形。</p>
<p> 表4.9所对应的优先函数可定义为:</p>
</td></tr></table>
<p>
<center><img src="images/4.13b.gif"></center></p>
<table><tr><td>    </td>
<td class="content">
<p>例如,f(*)<g(id)意味着*<·id,f(id)>g(id)意味着id·>id。但是事实上没有优先关系成立于id和id之间。优先函数的利用使得表4.9中的其他错误人口也被放上了这个或那个优先关系。</p>
<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='4.6.2.0b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.6.3.0b.htm'"></img></td>
</tr>
</table>
</BODY>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -