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

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

<font class="title2"><b>5.6.3 模拟继承属性的计算</b></font>             

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<P>
要想从栈中找到继承属性值当且仅当文法允许属性值在栈中存放的位置可以预知。 
</p>
</td></tr></table>


<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<P>
<b>例5.18</b>  作为一个不能预知属性值在栈中所放位置的例子,我们考虑下面翻译模式:     
</p>
</td></tr></table>

<table><tr><td></td>
<td class="content">
<P>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;产生式 &nbsp;&nbsp;&nbsp;&nbsp;语义规则        
        <br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S→aAC &nbsp;&nbsp;&nbsp;&nbsp;C.i:=A.s        
        <br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S→bABC&nbsp;&nbsp;&nbsp;        
        C.i:=A.s &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(5.6)        
        <br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C→c &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C.s:=g(C.i)        
</p>
</td></tr></table>

<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<P>
属性C.i通过一个复写规则来继承属性A.s的值。注意在栈中A和C之间可能有B也可能没有B,当通过C→c进行归约时,C.i的值可能在val[top-1]处也可能在val[top-2]〕处,但我们不能确定究竟在哪个位置。其解决办法如下。 
</p>
</td></tr></table>


<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<P>
在图5.22和翻译模式(5.6)中,一个新的标识非终结符号M正好插入在(5.6)中第二个产生式右端的C的前面。如果我们根据产生式S→bABMC进行分析,那么C.i可通过M.i和M.s间接地继承A.s的值。当应用产生式M→ε时,复写规则M.s:=M.i使得值M.s=M.i=A.s正好出现在分析栈中C的子树所占用的那部分栈的前面。于是当应用C→c时,C.i的值可以在val[top-1]处找到,而与用在修改以后的翻译模式中的第一个产生式还是第二个产生式无关。在模式(5.6)'中的第二个产生式中的M与第一个产生式中的A的后面都是紧接着C。 
</p>
</td></tr></table>
    

<table><tr><td></td>
<td class="content">
<P>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;产生式 &nbsp;&nbsp;&nbsp;&nbsp;语义规则        
        <br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S→aAC &nbsp;&nbsp;&nbsp;&nbsp;C.i:=A.s        
        <br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S→bABMC &nbsp;&nbsp;M.i:=A.s;Ci:=M.s        
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(5.6)' 
        <br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C→c &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C.s:=g(C.i)        
        <br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;M→ε&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        
        M.s:=M.i 
</p>
</td></tr></table>
<br>  

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

</BODY>

⌨️ 快捷键说明

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