📄 7.8.5.htm
字号:
<html>
<head>
<title>7.5的解答</title>
</head>
<body background="../images/background.gif">
<center><font class="title2"><b>练习7.5</b></font></center><br>
<p class="MsoNormal"><span lang="EN-US">解答:</span></p>
<p class="MsoNormal"><span lang="EN-US"> 首先消除图7.14中翻译模式的左递归:</span></p>
<p class="MsoNormal" align="center"><img src="5.gif.gif" width="656" height="420"
alt="习题5.gif (9955 bytes)"></p>
<p class="MsoNormal" align="left"> (注:'{','}'为元语言符号。)</p>
<p class="MsoNormal" align="left"> 递归预测翻译程序如下:</p>
<p class="MsoNormal" align="left"> TYPE<br>
link = 表类型;</p>
<p class="MsoNormal" align="left"> PROCEDURE E ;<br>
VAR<br>
E.truelist, E.falselist, T.truelist, T.falselist: link;<br>
BEGIN<br>
{ E.truelist, E,falselist } := T;<br>
WHILE ( lookahead == 'or ' ) DO<br>
BEGIN<br>
match(or);<br>
M.quad := nextquad;<br>
{ T.truelist, T.falselist } := T;<br>
backpatch(E.falselist, M.quad);<br>
E.truelist := merge(E.truelist, T.truelist);<br>
E.falselsit := T.falselist<br>
END;<br>
return({E.truelist, E.falselist})<br>
END;</p>
<p class="MsoNormal" align="left"> PROCEDURE T;<br>
VAR<br>
T.truelist, T.falselist, F.truelsit, F.falselist: link;<br>
BEGIN<br>
{ T.truelist, T,falselist } := F;<br>
WHILE ( lookahead == 'and ' ) DO<br>
BEGIN<br>
match(and);<br>
M.quad := nextquad;<br>
{ F.truelist, F.falselist } := F;<br>
backpatch(T.truelist, F.truelist);<br>
T.truelist := F.truelist;<br>
T.falselist := merge(T.falselist, F.falselist)<br>
END;<br>
return({T.truelist, T.falselist})<br>
END;</p>
<p class="MsoNormal" align="left"> PROCEDURE F;<br>
VAR<br>
F.truelist, F.falselist, E.truelsit, E.falselist: link;<br>
BEGIN<br>
CASE ( lookahead ) OF<br>
'not' : BEGIN<br>
match(not);<br>
{ E.truelist, E.falselist } := F;<br>
F.truelist := E.falselist;<br>
F.falselist := E.truelist<br>
END;<br>
'( ' : BEGIN<br>
match(();<br>
{ E.truelist, E.falselist ) := E;<br>
match());<br>
F.truelist := E.truelist;<br>
F.falselist := E.falselist<br>
END;<br>
'id' : BEGIN<br>
match(id);<br>
match(relop);<br>
match(id);<br>
F.truelist := makelist(nextquad);<br>
F.falselist := makelist(nextquad+1);<br>
emit('if' id<sub>1</sub>.place relop id<sub>2</sub>.place 'goto-');<br>
emit('goto-')<br>
END;<br>
'true': BEGIN<br>
match(true);<br>
F.truelist := makelist(nextquad);<br>
F.falselist := null;<br>
emit('goto-')<br>
END;<br>
'false':BEGIN<br>
match(false);<br>
F.truelist := makelist(nextquad);<br>
F.falselist := null;<br>
emit('goto-')<br>
END<br>
otherwise : error<br>
END of CASE<br>
return({F.truelist, F.falselist})<br>
END; </p>
</body>
</html>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -