⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.8.0.htm

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 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>&nbsp&nbsp&nbsp&nbsp</td>        
<td class="content">        
<p>任何二义文法决不是一个LR文法。但是某些二义文法是非常有用的。例如,若用下面的文法来描述含有+及*的算术表达式<br>   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E→E+E|E*E|(E)|id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4.19)   <br> 
&nbsp;&nbsp;&nbsp;&nbsp;那么只要对+及* 赋予优先级和结合规则,这个文法是再简单不过的了。这个文法与我们在例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 + -