📄 7.8.6.htm
字号:
<html>
<head>
<title>7.6的解答</title>
</head>
<body background="../images/background.gif">
<center><font class="title2"><b>练习7.6</b></font></center><br>
<p class="MsoNormal"><span lang="EN-US">解答:</span></p>
<p class="MsoNormal"><span lang="EN-US">
首先消除控制语句的翻译模式中的左递归。仅涉及L的产生式。因此,关于L的翻译模式改写成:<br>
L</span><font FACE="宋体">->S
{L.nextlist := S.nextlist}<br>
'{ '; M S<sub>1</sub> {backpatch(L.nextlist, M.quad);<br>
L.nextlist := S<sub>1</sub>.nextlist;}<br>
' }'<br>
递归预测翻译程序如下: </font></p>
<p class="MsoNormal"> PROCEDURE S ;<br>
VAR<br>
S.nextlist, S<sub><font
FACE="宋体">1</font></sub>.nextlist, S<sub>2</sub>.nextlist,<br>
E.truelist,
E.falselist, N.nextlist: link;<br>
M.quad: integer;<br>
BEGIN<br>
CASE ( lookahead ) OF<br>
'if'
: BEGIN<br>
match(if);<br>
{ E.truelist, E.falselist } := E;<br>
M.quad := nextquad;<br>
backpatch(E.truelist, M.quad);<br>
S<sub>1</sub>.nextlist := S;<br>
if ( lookahead == 'else' )<br>
THEN BEGIN<br>
N.nextlist := N;<br>
match(else);<br>
M.quad := nextquad;<br>
S<sub>2</sub>.nextlist := S;<br>
backpatch(E.falselist, M.quad);<br>
S.nextlist := merge(S<sub>1</sub>.nextlsit, N.nextlist, S<sub>2</sub>.nextlist)<br>
END<br>
ELSE S.nextlist := merge(E.falselist, S<sub>1</sub>.nextlist);<br>
END;<br>
'while ' : BEGIN<br>
match(while);<br>
M.quad := nextquad;<br>
{ E.truelist, E.falselist ) := E;<br>
match(do);<br>
backpatch(E.truelist, nextquad);<br>
S<sub>1</sub>.nextlist := S;<br>
backpatch(S<sub>1</sub>.nextlist, M.quad);<br>
emit('gogo' M.quad);<br>
S.nextlist := E.falselist<br>
END;<br>
'begin' : BEGIN<br>
match(begin);<br>
S.nextlist := L;<br>
match(end)<br>
END;<br>
other :
BEGIN<br>
A;<br>
S.nextlist := makelist()<br>
END;<br>
END of CASE;<br>
return(S.nextlist)<br>
END; </p>
<p class="MsoNormal" align="left"> PROCEDURE N;<br>
VAR N.nextlist : link;<br>
BEGIN<br>
N.nextlist :=
makelist(nextquad);<br>
emit('goto-');<br>
return(N.nextlist)<br>
END;</p>
<p class="MsoNormal" align="left"> PROCEDURE L;<br>
VAR <br>
L.nextlist, S.nextlist:
link;<br>
M.quad: integer;<br>
BEGIN<br>
L.nextlist := S;<br>
WHILE ( lookahead ==
';' ) DO<br>
BEGIN<br>
match(;);<br>
backpatch(L.nextlist, nextquad);<br>
S.nextlist := S;<br>
L.nextlist := S.nextlist<br>
END;<br>
return(L.nextlist)<br>
END;
</p>
<p class="MsoNormal" align="left">
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -