📄 a_5.5.htm
字号:
<html>
<head>
<title>5.5的解答</title>
</head>
<body background="../../images/background.gif">
<center><font class="title2"><b>练习5.5</b></font></center><br>
<p>解答: (a)用综合属性决定s.val的语法制导定义:</p>
<table align = center border = 1 width = "80%" cellspacing="0" cellpadding="5">
<tr>
<td width = "30%"><div align = center>产生式</div></td>
<td width = "70%"><div align = center>语义规则</div></td>
</tr>
<tr>
<td >
S -> L
</td>
<td >
S.val:=L.val;
</td>
</tr>
<tr>
<td >
S -> L<sub>1</sub>.L<sub>2</sub>
</td>
<td>
S.val:=L<sub>1</sub>.val+L<sub>2</sub>.val*L<sub>2</sub>.p;
</td>
</tr>
<tr>
<td>
L -> B
</td>
<td>
L.val:=B.val; L.p:=2<sup>-1</sup>;
</td>
</tr>
<tr>
<td>
L -> L<sub>1</sub>B
</td>
<td>
L.val:=L<sub>1</sub>.val*2+B.val;
<p>L.p:=L.p*2<sup>-1</sup>;</p>
</td>
</tr>
<tr>
<td>
B -> 0
</td>
<td>
B.val:=0;
</td>
</tr>
<tr>
<td>
B -> 1
</td>
<td>
B.val:=1;
</td>
</tr>
</table>
<p> 注:L.p表示恢复L.val的因子。</p>
<p> (b)分析:设B.c是B的综合属性,是B产生的位对最终值的贡献。要求出B.c,必须求出B产生位的<br>
权,设B.i。B.i的求法请参看下面的图示:</p>
<p align=center><img src="a_5.5.gif" width="661" height="360"></p>
<p> 另外,设L.fi为继承因子,L.fs为综合因子,语法制导定义如下:</p>
<table align = center border = 1 width = "80%" cellspacing="0" cellpadding="5">
<tr>
<td width = "30%"><div align = center>产生式</div></td>
<td width = "70%"><div align = center>语义规则</div></td>
</tr>
<tr>
<td >
S -> L
</td>
<td >
L.i:=1; L.fi:=2; L.fs:=1; S.val:=L.val;
</td>
</tr>
<tr>
<td >
S -> L<sub>1</sub>.L<sub>2</sub>
</td>
<td>
L<sub>1</sub>.i=1; L<sub>1</sub>.fi=2; L<sub>1</sub>.fs:=1;
<p>L<sub>2</sub>.i=2<sup>-1</sup>; L<sub>2</sub>.fi=1; L<sub>2</sub>.fs:=2<sup>-1</sup>;</p>
<p>S.val:=L<sub>1</sub>.val+L<sub>2</sub>.val;</p>
</td>
</tr>
<tr>
<td>
L -> B
</td>
<td>
L.s:=L.i; B.i:=L.s; L.val:=B.c;
</td>
</tr>
<tr>
<td>
L -> L<sub>1</sub>B
</td>
<td>
L<sub>1</sub>.i:=L.i*L<sub>1</sub>.fi;
<p>L.s:=L<sub>1</sub>.s*L<sub>1</sub>.fs;</p>
<p>B.i:=L.s;</p>
<p>L.val:=L<sub>1</sub>.val+B.c;
</td>
</tr>
<tr>
<td>
B -> 0
</td>
<td>
B.c:=0;
</td>
</tr>
<tr>
<td>
B -> 1
</td>
<td>
B.c:=B.i;
</td>
</tr>
</table>
<p>
若把文法改写成如下形式,则语法制导定义会更清楚:</p>
<p>
S -> L.R | L</p>
<p>
L -> LB | B</p>
<p>
R -> Rb | B</p>
<p>
B -> 0 | 1</p>
<table align = center border = 1 width = "80%" cellspacing="0" cellpadding="5">
<tr>
<td width = "30%"><div align = center>产生式</div></td>
<td width = "70%"><div align = center>语义规则</div></td>
</tr>
<tr>
<td >
S -> L
</td>
<td >
L.i:=1; S.val:=L.val;
</td>
</tr>
<tr>
<td >
S -> L.R
</td>
<td>
L.i=1; R.i=2<sup>-1</sup>;<p>S.val:=L.val+R.val;</p>
</td>
</tr>
<tr>
<td>
L -> L<sub>1</sub>B
</td>
<td>
B.i:=L.i; L<sub>1</sub>.i:=L.i*2;<p>L.val:=L<sub>1</sub>.val+B.c;</p>
</td>
</tr>
<tr>
<td>
L -> B
</td>
<td>
B.i:=L.i; L.val:=B.c;
</td>
</tr>
<tr>
<td>
R -> R<sub>1</sub>B
</td>
<td>
R<sub>1</sub>.i:=R.i; R.s:=R<sub>1</sub>.s*2<sup>-1</sup>;<p>B.i:=R.s;</p>
</td>
</tr>
<tr>
<td>
R -> B
</td>
<td>
R.s:=R.i; B.i:=R.s;
<p>R.val:=B.c;</p>
</td>
</tr>
<tr>
<td>
B -> 0
</td>
<td>
B.c:=0;
</td>
</tr>
<tr>
<td>
B -> 1
</td>
<td>
B.c:=B.i;
</td>
</tr>
</table>
</body>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -