📄 5.3.0.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.2.4b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.3.0b.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>5.3 S-属性定义及其自底向上的计算</b></font>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
既然我们已经知道了如何用语法制导定义来说明翻译,现在我们就来研究怎样实现这种翻译器。一个一般的语法制导定义的翻译器可能是很难建立的,然而有一大类的语法制导定义的翻译器是很容易建立的。这一节我们考虑这样的一类定义:S-属性定义,即只含有综合属性的语法制导定义。下面几节将介绍带有继承属性的语法制导定义的实现。
</p>
</td>
</tr>
</table>
<table><tr><td>    </td>
<td class="content">
<p>综合属性可以在分析输入符号串的同时由自底向上的分析器来计算。分析器可以保存与栈中文法符号有关的综合属性值,每当进行归约时,新的属性值就由栈中正在归约的产生式右边符号的属性值来计算。这一节我们将介绍怎样扩充分析器中的栈来存放这些综合属性值。在5.6节中我们将看到这种实现对于某些继承属性的计算也适用。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>在表5.3中,建立表达式语法树的语法制导定义中只有综合属性出现,因此,可以用这一节中的方法在自底向上的分析中建立语法树。我们将在第5.5节中看到,在自顶向下的分析过程中表达式的翻译通常使用继承属性。因此我们将在下一节考查了“从左到右”的依赖关系后再讨论自顶向下分析过程中的翻译。
</p>
</td>
</tr>
</table>
<table><tr><td>    </td>
<td class="content">
<p>
下面我们讨论分析栈中的综合属性。
</p>
</td>
</tr>
</table>
<table><tr><td>    </td>
<td class="content">
<p>
在自底向上的分析方法中,我们使用一个栈来存放已经分析过的子树的信息。现在我们可以在分析栈中使用一个附加的域来存放综合属性值。图5.8表示的是一个带有一个属性值空间的分析栈的例子。我们假设图中的栈是由一对数组state和val来实现的。每一个state元素都是一个指向LR(1)分析表的指针(或索引)。(注意,文法符号隐含在state中而不需存贮在栈中。)然而,如果象第四章中那样在把文法符号放入栈中时,用单个文法符号来代表state的话,那么当第i个state符号为A时,val[i]中就存放分析树中与结点A对应的属性值。
</p>
</td>
</tr>
</table>
<p align=center><img src="images/5_8.gif"></p>
<p align=center>图5.8 带有综合属性域的分析栈</p>
<br>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.2.4b.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.3.0b.htm'"></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -