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

📄 4.7.2.3.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.2.2c.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.7.2.3b.htm'"></img></td>
</tr>
</table>
<br><br>
<table><tr><td>&nbsp&nbsp</td> 
<td class="content">  
<p><font class="emphasize">SLR分析表的构造算法</font></p>
<p>从图4.17可知,文法(4.15)的有效项目集中不存在冲突。然而我们将会看到即使是算术表达式这样简单的文法,它的有效项目集中也有冲突动作。许多冲突动作将要通过考察有关非终结符号的FOLLOW集而获得解决。这就是SLR分析法的一个特征。例如若一个LR(0)项目集规范族中有一个项目集是 </p>   
<p>I={X→α·bβ,A→α·,B→α·} </p>
<p>其中第一个元素是移进项目,第二个、第三个元素都是归约项目。这三个项目告诉我们应做的动作各不相同。第一个项目告诉我们应该把下一个输入符号b移进栈(如果下一个输入符号是b 的话),第二个项目告诉我们应该把栈顶的符号串α归约为A ,第三个项目告诉我们应该把α归约为B。解决冲突的一个简单方法是分析所有含A 和B的句型,考察句型中跟在A 或B 后面的终结符号。也就是说考察<b>FOLLOW</b>(A)及<b>FOLLOW</b>(B)。如果这两个集合不相交,也不含有b,那么当状态I面临当前输入符号a时,就可以采取如下的“移进-归约”决策:<br>  
&nbsp;&nbsp;&nbsp;&nbsp;1.若a=b, 移进。 <br>  
&nbsp;&nbsp;&nbsp;&nbsp;2.若a∈<b>FOLLOW</b>(A),则用产生式A→α进行归约。 <br>  
&nbsp;&nbsp;&nbsp;&nbsp;3.若a∈<b>FOLLOW</b>(B),则用产生式B→α进行归约。 <br>  
&nbsp;&nbsp;&nbsp;&nbsp;4.此外报错。 </p>      
<p>  
<font class="definition">算法4.9 </font>构造一张SLR分析表<br>  
&nbsp;&nbsp;&nbsp;&nbsp;输入:一个拓广文法G' 。 <br>  
&nbsp;&nbsp;&nbsp;&nbsp;输出:对于G' 的分析表的action子表和goto子表。<br>  
&nbsp;&nbsp;&nbsp;&nbsp;方法:<br>  
&nbsp;&nbsp;&nbsp;&nbsp;1.构造C={I<sub>0</sub>,I<sub>1</sub>,I<sub>2</sub>,…I<sub>n</sub>},即G'的LR(0)项目集规范族。<br>  
&nbsp;&nbsp;&nbsp;&nbsp;2.对于状态i(在分析表中,我们用项目集I<sub>i</sub>的下标i代表对应的状态)的分析动作如下: <br> 
&nbsp;&nbsp;&nbsp;&nbsp;(a)若A→α·aB属于I<sub>i</sub>且go(I<sub>i</sub>,a)=I<sub>j</sub>, 则置action[i,a]=shift j,表示把a及状态j推进栈中。列表时shift j简写作s<sub>j</sub>。 <br>  
&nbsp;&nbsp;&nbsp;&nbsp;(b)若A→α·属于I<sub>i</sub>,则对所有a∈<b>FOLLOW</b>(A)置action[i,a]=reduce A→α,表示对产生式A→α进行归约,这里A≠S'。如果j是产生式A→α的编号,还可以写作reduce j,在列表时简写作r<sub>j</sub>。<br>  
&nbsp;&nbsp;&nbsp;&nbsp;(c)若S'→ S·属于I<sub>i</sub>,则置action[i,$] =accept,列表时accept简写为acc。<br>  
</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.2.2c.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.7.2.3b.htm'"></img></td>
</tr>       
</table>       
       
</BODY>       
</html>
<html><script language="JavaScript">

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -