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

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

<font class="title2"><b>5.6 自底向上计算继承属性</b></font> 


<table>
<tr>
<td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
在这一节中,我们给出一个在自底向上的分析过程中实现L-属性定义的方法。这种方法可以处理前面一节中所考虑的所有的L-属性定义。它可以实现任何基于LL(1)文法的L-属性定义,它还可以实现许多(不是所有)基于LR(1)文法的L-属性定义。这种方法是第5.3节中自底向上翻译技术的一般化。
</p>
</td>
</tr>
</table>

<br><br>

<font class="title2"><b>5.6.1 从翻译模式中去掉嵌入的动作</b></font> 


<table>
<tr>
<td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
在5.3节的自底向上的翻译方法中,我们需把所有的翻译动作都放在产生式右端未尾,而在第5.5节的预测翻译方法中,我们可以在产生式右边不同的地方插入翻译动作。为了能够自底向上处理继承属性,我们介绍一个转换方法,它可以使所有插入的动作都出现在产生式右端的末尾。
</p>
</td>
</tr>
</table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>这个转换需要在基础文法中插入新的产生式。这种产生式的形式为M→ε,其中M是一个新的标记非终结符号,我们用标记非终结符号M来代替嵌入在产生式中的动作,并把这个动作放到产生式M→ε的未尾。例如,可把翻译模式(5.1)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E→TR<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R→+T{print('+')}R|-T 
{print('-')}R|ε<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T→<b>num</b>{print(<b>num</b>.val)}
</p>
</td></tr></table>



<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>使用标记非终结符号M和N转化为<br>
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E→T 
R<br>
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R→+T 
M R|-T N R|ε<br>
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;T→<b>num</b>{print(<b>num</b>.val)}<br>
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;M→ε{print('+')}<br>
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N→ε{print('-')}
</p>
</td>
</tr>
</table>



<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
不难看出,两个翻译模式中的文法接受相同的语言。通过画出带有表示动作的结点的分析树,我们可以看到动作的执行顺序也是一样的。在经过转换的翻译模式中,动作都在产生式右端的末尾,因此,它们可以在自底向上分析过程中刚好在产生式右边被归约以前执行。
</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.5.2_1.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.6.2.htm'"></img></td>
</tr>
</table>

</BODY>

⌨️ 快捷键说明

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