📄 4.6.1.0b.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.1.0.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.6.1.0c.htm'"></img></td>
</tr>
</table>
<br><br>
<table><tr><td>    </td>
<td class="content">
<table><tr>
<td class="content">
<p>总之,在右句型中移走非终结符号并加进左右分界符号$,然后在相邻符号之间置放它们的优先关系,就得到一个新的符号串。利用此符号串可以用下面的办法找到右句型的可归约串。</p>
<p>1. 从左至右扫描符号串直至遇到第一个·>为止。在(4.14)中,这个事实发生在第一个id与+ 之间。</p>
<p>2. 然后向回扫描(向左)越过任何<img src="images/equalpoint.gif" width="20" height="19">,直至一个<·被发现。在(4.14)中,向回扫描至$。</p>
<p>3. 可归约串包括在第(1)步所遇到的·>的左边和第(2)步所遇到的<·的右边的所有终结符号,包括插入在中间的或环绕在两旁的非终结符号。在(4.14)中,可归约串是第一个id。</p>
<p>如果我们正在用文法(4.13)对句子id+id*id进行处理,那么我们将归约id到E。于是,得到右句型E+id*id。在用同样的步骤归约了两个剩下的id到E之后,我们得到右句型E+E*E。在此符号串中去掉非终结符号,加入左右分界符号,得到$+*$,再插入优先关系,最后得到:</p>
<p>$<·+<·*·>$</p>
<p>由上面的方法可知可归约串的左终点位于+ 和*之间,右终点位于*和$之间。这表示,右句型E+E*E的可归约串含有一个终结符号*和环绕它的两个非终结符号,即E*E。</p>
<hr size=2 width=90% align=center color=red>
<p>下面我们利用一个栈来存储已经扫描过的符号,包括终结符号和非终结符号。并利用优先关系来指导“移进一归约”分析器的动作。如果优先关系<·或对于在栈中最靠顶上的终结符号和下一个输入符号之间成立的话,表示尚未发现可归约串的右端点,则分析器进行移进。如果优先关系·>成立,表示已找到可归约串的右端点,分析器将进行归约。如果在一对终结符号之间不存在优先关系〔在优先关系表中用空白入口表示),则表示存在一个语法错误,分析器将调用一个出错处理程序。这些想法可形式化为如下的算法。</p>
</td></tr></table>
<br>
<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.1.0.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.6.1.0c.htm'"></img></td>
</tr>
</table>
</BODY>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -