📄 4.8.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.7.4.4c.htm'" width="24" height="24" ></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.8.1.htm'" width="26" height="24"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>4.8 LR分析方法对二义文法的应用
</b></font>
<table><tr><td>    </td>
<td class="content">
<p>任何二义文法决不是一个LR文法。但是某些二义文法是非常有用的。例如,若用下面的文法来描述含有+及*的算术表达式<br>
E→E+E|E*E|(E)|id (4.19) <br>
那么只要对+及* 赋予优先级和结合规则,这个文法是再简单不过的了。这个文法与我们在例4.16中曾考虑过的文法
<table align=center width=450 class="content">
<tr><td>E→E+T|T</td><td></td></tr>
<tr><td>T→T*F|F</td><td>(4.20)</td></tr>
<tr><td>F→(E)|id</td><td></td></tr>
</table>
相比,有两个明显的好处。首先,如果需要改变算符的优先级或结合规则则无需改变文法(4.19)自身。其次文法(4.19)的LR分析表所含状态肯定比文法(4.20)少得多。因为文法(4. 20)中含有E→T和T→F二个旨在定义算符优先级和结合规则的产生式。这两个右部只有一个单一的非终结符号的产生式,要占用不少状态和消耗不少时间。
<p>本节,我们要讨论的问题是,如何使用LR分析的基本思想,并凭借一些其它条件,来分析二义文法所定义的语言。我们以文法(4.19)为例,文法(4.19)的拓广文法的LR(0)项目集规范族如图4.26所示。这个LR(0)项目集规范族的识别活前缀的DFA,在状态I<sub>1</sub>存在接受和移进冲突,这可以用SLR方法予以解决。因为FOLLOW(S')={$},所以当面临输入符号$时,接受是唯一可行的动作。当面临+和*时才要求移进。但在状态I<sub>7</sub>所存在的移进和归约冲突却不能用SLR方法予以解决,这是因为+和*都属于FOLLOW(E) 。状态I<sub>8</sub> 在面临输入符号+和*时也存在类似问题。这些冲突要借助其他条件才能解决,这个条件就是使用关于+和*的优先级和结合规则的有关信息。
</td></tr></table>
<p>
<center><img src="images/4.26.gif" ></center><br>
<center class="content">图 4.26 拓广文法(4.19)的LR(0)项目集规范族 </center></p>
<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.4c.htm'" width="24" height="24"></img></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.8.1.htm'" width="26" height="24"></img></td>
</tr>
</table>
</BODY>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -