📄 5.4.2_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.4.2.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.4.2_2.htm'"></img></td>
</tr>
</table>
<br><br>
<table><tr><td>  </td>
<td class="content">
<p>当设计翻译模式时,我们必须注意某些限制以保证当某一个动作引用一个属性时它必须是可用的。L-属性定义本身就考虑了这些限制,因此确保了一个动作不会引用值还没有计算出来的属性。
</p>
</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>
我们可以看到,只需要综合属性的情况最为简单。在这种情况下,我们可以这样来建立翻译模式:为每一个语义规则建立一个包含赋值的动作,并把这个动作放在相应的产生式右边的末尾。例如,对下面的产生式和语义规则
</p>
</td>
</tr>
</table>
<table align=center width=50%>
<tr>
<td align=center><b>产生式</b></td>
<td align=center><b>语义规则</b></td>
</tr>
<tr>
<td align=center>T->T<SPAN class=down><sub>1</sub></SPAN>* F</td>
<td align=center>T.val:=T<SPAN class=down><sub>1</sub></SPAN>.val * F.val</td>
</tr>
</table>
<table><tr><td> </td>
<td class="content">
我们得到产生式和语义动作
</td>
</tr>
</table>
<table align=center width=50%>
<tr>
<td align=center>T->T<SPAN class=down><sub>1</sub></SPAN>* F</td>
<td align=center>{T.val:=T<SPAN class=down><sub>1</sub></SPAN>.val * F.val}</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>如果既有综合属性又有继承属性,在建立翻译模式时我们就必须小心处理:
</p>
</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>1.产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来。
</p>
</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>2.一个动作不能引用这个动作右边的符号的综合属性。
</p>
</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>3.产生式左边非终结符号的综合属性只有在它所引用的所有属性都计算出来以后才能计算。计算这种属性的动作通常可放在产生式右端的未尾。
</p>
</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>在下面两节中,我们将看到一个满足上述三个要求的翻译模式怎样通过一般的自底向上或自顶向下的分析器来实现。
</p>
</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>下面的翻译模式不满足第一个要求:
</p>
</td>
</tr>
</table>
<table align=center width=50%>
<tr>
<td align=left>S→A<sub>1</sub>A<sub>2 </sub></td>
<td align=left>{ A<sub>1</sub>.in:=1;A<sub>2</sub>.in:=2}</td>
</tr>
<tr>
<td > A→a </td>
<td >{ print(A.in)}</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>不难看到,在按深度优先周游输入符号串aa的分析树的过程中,当要执行在第二个产生式的print(A.in)时继承属性A.in
没有定义。即,从S开始按深度优先周游A<span class="down"><sub>1</sub></span>子树和A<span class="down"><sub>2</sub></span>子树以前,A<span class="down"><sub>1</sub></span>.in和A<span class="down"><sub>2</sub></span>.in未被置值。如果计算A<span class="down"><sub>1</sub></span>.in和A<span class="down"><sub>2</sub></span>,in的值的动作被嵌人在产生式S→A<span class="down"><sub>1</sub></span>A<span class="down"><sub>2</sub></span>的右边A<span class="down"><sub>1</sub></span>之前面而不是放在后面,那么A.in
在每次使用print(A.in)时已有定义。
</p>
</td>
</tr>
</table>
<table><tr><td>  </td>
<td class="content">
<p>通常我们有可能从L-属性语法制导定义开始来建立一个满足上述三个条件的翻译模式。下面一个例子说明了这种建立过程。它基于数学格式语言EQN。给定输入<br>
E sub 1.val<br>
EQN把E,1和.val分别以不同的大小放在有关的位置上,如图5.1l所示。注意,角标1用小一号的铅字印出,并且它的位置相对于E和.val向下移动一些。
</p>
</td>
</tr>
</table>
<table>
<tr>
<td><font class="yanshi">   观看演示 </font></td>
<td><font color=blue onmouseover="javascript:style.cursor='hand'" onclick="javascript:open('compile5_4/compile.html','_blank','menu=no,toolbar=no,location=no,directories=no,status=no,scrollbars=yes,resizable=yes,copyhistory=no,left=100,top=100,width=800,height=600')">具有综合属性和继承属性的简单的翻译模式的应用</font></td>
<td><img src="../images/yanshi.gif"></img></td>
</tr>
</table>
<p align=center><img src="5_11.gif" width="255" height="69"></p>
<p align=center>图5.11 盒子的语法制导安放</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.4.2.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='5.4.2_2.htm'"></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -