📄 4.7.4.1c.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.1b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.7.4.2.htm'"></img></td>
</tr>
</table>
<br><br>
<table><tr><td>    </td>
<td class="content">
<p>现在来看如何计算函数go,譬如go(I<sub>36</sub>,C)。在原来的LR(1)项目集中,go(I<sub>3</sub>,C)=I<sub>8</sub>,现在I<sub>8</sub>是I<sub>89</sub>的一部分,因此置go(I<sub>36</sub>,C)= I<sub>89</sub>。考虑I<sub>36</sub>的另一部分I<sub>6</sub>,可以得到同样的结论。即go(I<sub>6</sub>,C)=I<sub>9</sub>,现在I<sub>9</sub>是I<sub>89</sub>的一部分。另一例,考虑go(I<sub>2</sub>,c),它是在执行了关于输入符号c上的I<sub>2</sub>所规定的移进动作之后的一个入口。在原来的LR(1)项目集中,go(I<sub>2</sub>,c)=I<sub>6</sub>。由于现在I<sub>6</sub>是I<sub>36</sub>的一部分,所以go(I<sub>2</sub>,c)=I<sub>36</sub>。于是,在表4.14中的对于状态2和输入符号c 的入口是s<sub>36</sub>。这意味着,移进c,再把状态36置于栈顶。
</p>
<p>
当输入符号串为c<sup>*</sup>dc<sup>*</sup>d时,不论是表4.13的LR分析器还是表4.14的LALR分析器,都给出了同样的移进和归约的序列。其差别只是状态名不同而已,例如,如果LR分析器把I<sub>3</sub>或I<sub>6</sub>堆入栈顶,LALR分析器将把I<sub>36</sub>堆入栈顶。对于正确的输入串,LR和LALR分析器始终形影相随。
</p>
<p>但是,当遇有错误输入时,LALR可能会比LR多做些归约动作,而LR则能立即报错。但LALR决不会比LR移进更多的符号。例如,在输入ccd之后为$,表4.13的LR分析器将把 <br>
0c3c3d4 <br>
堆入栈顶,并且在状态4将发现一个错误,因为$是下一个输入符号,并且在$之上状态4的动作是报错。而另一方面,表4.14的LALR做相应的动作,将把 <br>
0c36c36d47<br>
堆入栈顶。但是状态47遇到输入符号$时将按照产生式C→d进行归约。LALR分析器将把栈改变为 <br>
0c36c36C89<br>
现在,状态89在输入符号$上的动作是按C→cC进行归约。这时栈变为 <br>
0c36C89 <br>
再作一个类似的归约,得到如下的栈: <br>
0C2 <br>
最后,状态2遇到输入符号$,发现错误。
</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.1b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.7.4.2.htm'"></img></td>
</tr>
</table>
</BODY>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -