📄 4.7.2.3.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>  </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>
1.若a=b, 移进。 <br>
2.若a∈<b>FOLLOW</b>(A),则用产生式A→α进行归约。 <br>
3.若a∈<b>FOLLOW</b>(B),则用产生式B→α进行归约。 <br>
4.此外报错。 </p>
<p>
<font class="definition">算法4.9 </font>构造一张SLR分析表<br>
输入:一个拓广文法G' 。 <br>
输出:对于G' 的分析表的action子表和goto子表。<br>
方法:<br>
1.构造C={I<sub>0</sub>,I<sub>1</sub>,I<sub>2</sub>,…I<sub>n</sub>},即G'的LR(0)项目集规范族。<br>
2.对于状态i(在分析表中,我们用项目集I<sub>i</sub>的下标i代表对应的状态)的分析动作如下: <br>
(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>
(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>
(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 + -