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

📄 5.3.1.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='5.3.0b.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.3.1b.htm'"></td>
</tr>
</table>
<br><br>


<table>
<tr>
<td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
我们可以用第四章中的技术来为上述文法构造LR分析器。为了计算属性值,我们可以修改分析程序,使其在作相应的归约以前执行表5.4所示的代码段。注意,我们可以把属性计算与归约联系起来,因为每一次归约决定着所用的产生式。代码段是将表5.1中的语义规则通过用val数组中的一个位置来代替规则中的每一个属性而得到的。
</p>
</td>
</tr>
</table>


<p align=center>表5.4  用LR分析器实现台式计数器</p>                  



<table width="90%" align=center border="1" cellspacing="0" cellpadding="0" >
<tr>
<td  height=30 width="17%">产生式</td>
<td width="50%">代码段</td>
<td width="33%">注释</td>
</tr>
<tr>
<td>	
    <br>&nbsp;L -> En<br>         
    <br>&nbsp;E -> E<sub>1</sub>+T<br>         
    <br>&nbsp;E -> T<br>     
    <br>&nbsp;T -> T<sub>1</sub>*F<br>      
	<br>&nbsp;T -> F<br>     
    <br>&nbsp;F -> (E)<br>      
    <br>&nbsp;F -> digit<br>	      
</td>
<td>	
    <br>&nbsp;print(val[top])<br>
    <br>&nbsp;val[ntop] := val[top-2]<br>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;                                    +val[top]<br>            
	<br>&nbsp;<br>
	<br>&nbsp;val[ntop] := val[top-2]<br>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
                           *val[top]<br>    
	<br>&nbsp;<br>
	<br>&nbsp;val[ntop] := val[top-1]<br>            
	<br>&nbsp;<br>
</td>
<td>
    <br>	&nbsp;<br>
	<br>&nbsp;此时val[top-1]为'+'<br>
	<br>&nbsp;<br>
	<br>&nbsp;此时val[top-1]为'*'<br>
	<br>&nbsp;<br>
	<br>&nbsp;此时val[top]为')',<br>
	&nbsp;&nbsp;&nbsp;&nbsp;val[top-2]为'('<br>  
	<br>   
</td>
</tr>
</table>

<br>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
代码段中并没有说明如何控制变量top和ntop。当右边带有r个符号的产生式被归约时,在执行相应的代码段之前,应将top-r+l的值赋给新的栈顶ntop,在每一个代码段被执行之后,ntop的值赋给top。<br>
&nbsp;&nbsp;&nbsp;  
</p>
</td></tr></table>



<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
表5.5表示的是分析器在输入3*5+4<b>n</b>上的移动序列。在每一次移动后,给出了分析栈中state和val域的内容。我们仍用相应的文法符号来代替state中的状态,而且给出实际的输入数字而不是符号<b>digit</b>。
</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='5.3.0b.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.3.1b.htm'"></td>
</tr>
</table>

</BODY>

<html><script language="JavaScript">

⌨️ 快捷键说明

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