📄 5.6.1.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.6.0.htm'" width="65" height="27"></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.1 从翻译模式中去掉嵌入的动作</b></font>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
在5.3节的自底向上的翻译方法中,我们需把所有的翻译动作都放在产生式右端未尾,而在第5.5节的预测翻译方法中,我们可以在产生式右边不同的地方插入翻译动作。为了能够自底向上处理继承属性,我们介绍一个转换方法,它可以使所有插入的动作都出现在产生式右端的末尾。
</p>
</td>
</tr>
</table>
<table><tr><td>    </td>
<td class="content">
<p>这个转换需要在基础文法中插入新的产生式。这种产生式的形式为M→ε,其中M是一个新的标记非终结符号,我们用标记非终结符号M来代替嵌入在产生式中的动作,并把这个动作放到产生式M→ε的未尾。例如,可把翻译模式(5.1)<br>
E→TR<br>
R→+T{print('+')}R|-T
{print('-')}R|ε<br>
T→<b>num</b>{print(<b>num</b>.val)}
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>使用标记非终结符号M和N转化为<br>
E→T
R<br>
R→+T
M R|-T N R|ε<br>
T→<b>num</b>{print(<b>num</b>.val)}<br>
M→ε{print('+')}<br>
N→ε{print('-')}
</p>
</td>
</tr>
</table>
<table><tr><td>    </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.6.0.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>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -