📄 4.9.4.0.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='4.9.3.0.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.9.4.0b.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>4.9.4 Yacc的错误恢复
</b></font>
<table><tr><td> </td>
<td class="content">
<p>在Yacc中,错误恢复可以使用出错产生式的形式。首先,用户决定错误恢复与那些"主要的"非终结符有关,这些非终结符的典型选择是产生表达式,语句,分程序和过程的那些非终结符。然后用户把形式为A→error α的出错产生式加到文法上,其中A是主要非终结符,α是文法符号串,也可能是空串, error是Yacc保留字。Yacc将把出错产生式当作普通产生式处理。
</p>
<p>当Yacc产生的分析器遇到错误时,它用特别的方式处理其项目集含出错产生式的状态。遇到错时, Yacc从栈中弹出状态,直到发现栈顶状态的项目集包含形为A→·error α的项目为止。然后分析器把这虚构的记号error“移进”栈,好象它在输入中看见了这个记号。
</p>
<p当α为ε,立即进行对A的归约和执行产生式A→error的语义动作(它可能是用户说明的错误恢复例程).然后分析器抛弃若干输入符号直到发现一个能回到正常处理的输入符号为止。</p>
<p> 如果α非空, Yacc在输入串上向前寻找能够归约为α的子串。如果α含的都是终结符,那么它在输入上寻找这样的串,把它们移进栈,以完成到α的“归约”,这时,分析器有error α在它的栈顶。随后分析器把error α归约成A,恢复正常分析。</p>
<p>例如,出错产生式 <br>
stmt→error ; <br>
要求分析器在看见错误时,跳过下一个分号,好象这个语句已经看见。这个出错产生式的语义子程序不需要处理输入,只需产生诊断信息和设置标记禁止生成目标代码。
</p>
<p><font class="example">例4.24 </font>图4.32给出了图4.30台式计算器的带有出错产生式的Yacc说明。出错产生式为<br>
lines:error '\n' <br>
</p>
<p>当输入行有语法错误时,分析器从栈中弹出符号,直至碰到一个状态有移进error的动作。状态0是唯一的这种状态,因为它的项目含 <br>
lines→·error '\n'
</p>
<p>状态0总是在栈底。分析器把记号error移进栈,废弃输入符号,直至发现换行字符。分析器把换行符移进栈,把error '\n'归约成lines,输出诊断信息"重新输入上一行"。专门的Yacc例程yyerror使得分析器回到正常操作方式。</p>
</td></tr></table>
<br>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.9.3.0.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='4.9.4.0b.htm'"></img></td>
</tr>
</table>
</BODY>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -