📄 4.7.4.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.7.4.0.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.7.4.1.htm'"></img></td>
</tr>
</table>
<br><br>
<table><tr><td>    </td>
<td class="content">
<p>
让我们把I<sub>4</sub>与I<sub>7</sub>合并成一个集合记为I<sub>47</sub>,它仅含有项目[C→d·,c/d/$] 。把I<sub>0</sub>,I<sub>2</sub>,I<sub>3</sub>及I<sub>6</sub>导入I<sub>4</sub>或I<sub>7</sub>的标志为d的弧统统改为导入I<sub>47</sub>。状态I<sub>47</sub>的作用是不论遇到当前输入符号是c,d或$都用C→d进行归约。要注意到I<sub>47</sub>无法及时发现输入串所含错误,所幸的是在输入下一个符号之前,错误仍将被查出。
</p>
<p>由于go(I,X)仅仅依赖于I的心,因此LR(1)项目集合并后的转换函数可以通过go(I,X)自身的合并而得到,这就是说在合并项目集时用不着同时考虑修改转换函数的问题。动作action应当进行修改,使得能反映各被合并集合的既定动作。
</p>
<p>假定有一个LR(1)文法,即它的LR(1)项目集中不存在动作冲突。如果我们把同心的项目集合并为一,就可能导致冲突,但是这种冲突不会是移进- 归约冲突。因为如果存在这种冲突,则意味着对当前输入符号a,有一个项目[A→α·,a] 要求进行归约,同时又有一个项目[B→β·aγ,b] 要求把a移进。这两个项目既然同处在合并后的同一个项目集中,那么合并前必存在某个c使得[A→α·,a] 和[B→β·aγ,c] 同处于某个项目集中。这一点又表示原来的LR(1)项目集已存在移进-归约冲突。故同假设不符。因此同心集的合并,不会产生新的移进-归约冲突。事实上移进-归约冲突不依赖于向前搜索符号而依赖于其心。但是同心集的合并可能引起归约-归约冲突。例如,考虑文法 <br>
S'→S <br>
S→aAd|bBd|aBe|bAe <br>
A→c <br>
B→c </p>
<p>这个文法接受的语言是{acd,ace,bcd,bce}。如果我们构造这个文法的LR(1)项目集规范族,即知它是一个LR(1)文法。在它的集族中,对活前缀ac的有效项目集是{[A→c·,d],[B→c·,e]}。对活前缀bc的有效项目集是{[A→c·,e] ,[B→c·,d] }。这两个集合都不含冲突项目且具有相同的心。但一经合并就变成{[A→c·,e/d],[B→c·,e/d]}。显然这是一个含有归约-归约冲突的集合。因为当面临输入符号为e或d时,我们不知道该用A→c还是用B→c进行归约。</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.7.4.0.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.7.4.1.htm'"></img></td>
</tr>
</table>
</BODY>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -