- 1、本文档共24页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * 温故知新 0型文法 1型文法 2型文法 3型文法 上下文无关文法 自上而下 自下而上 LL(1)文法 2个函数 任何两个产生式A ?? |? 都满足下列条件: 1、FIRST(? ) ? FIRST(? ) = ? 2、若? ?* ? ,那么FIRST(?) ? FOLLOW(A) = ? 递归下降预测分析 非递归的预测分析 a + b $ 输入 预测分析程序 分析表M 输出 X Y Z $ 栈 3.3 自上而下分析 3.3.6 预测分析的错误恢复 编译器的错误概述 : 词法错误,如标识符、关键字或算符拼写错误 语法错误,如算术表达式的括号不配对 语义错误,如算符作用于不相容的运算对象 逻辑错误,如无穷的递归调用 3.3 自上而下分析 分析器对错误处理的基本目标 清楚而准确地报告错误的出现 迅速地从每个错误中恢复过来,以便诊断后面的错误,并尽量少出现伪错误 它不应该使正确程序的处理速度降低太多 3.3 自上而下分析 非递归预测分析在什么场合下发现错误 栈顶的终结符和下一个输入符号不匹配 栈顶是非终结符A,输入符号是a,而M[A , a]是空白 3.3 自上而下分析 非递归预测分析:采用紧急方式的错误恢复 发现错误时,分析器每次抛弃一个输入记号,直到输入记号属于某个指定的同步记号集合为止。 同步 词法分析器当前提供的记号流能构成的语法结构,正是语法分析器所期望的。 3.3 自上而下分析 同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合。 if expr then (then是expr的一个同步记号) 3.3 自上而下分析 同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合。 把高层结构的开始符号加到低层结构的同步记号集合中。 a := expr ; if … (语句的开始符号作为表达式的同步符号,以免遗漏分号时忽略一大段程序。) 3.3 自上而下分析 同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合。 把高层结构的开始符号加到低层结构的同步记号集合中。 把FIRST(A)的终结符加入A的同步记号集合。 3.3 自上而下分析 同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合。 把高层结构的开始符号加到低层结构的同步记号集合中。 把FIRST(A)的终结符加入A的同步记号集合。 如果非终结符可以产生空串,若出错时栈顶是这样的非终结符,则可以使用产生空串的产生式。 3.3 自上而下分析 同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合。 把高层结构的开始符号加到低层结构的同步记号集合中。 把FIRST(A)的终结符加入A的同步记号集合。 如果非终结符可以产生空串,若出错时栈顶是这样的非终结符,则可以使用产生空串的产生式。 如果终结符在栈顶而不能匹配,弹出此终结符。 同步记号加到表3.1的分析表上 非终 结符 输 入 符 号 id + * ( ) $ E E ? TE ? E ? TE ? synch synch E ? E ? ? +TE ? E ? ? ? E ? ? ? T T ? FT ? synch T ? FT ? synch synch T ? T ? ? ? T ? ? *FT ? T ? ? ? T ? ? ? F F ? id synch synch F ? (E) synch synch 总结一下出错的三种情况: 1 查表,表项是空白,栈顶不变,输入串指针后移;(相当于抛弃记号) 2 查表,表项是synch,弹栈,并且弹出的是一个非终结符 3 栈顶终结符和输入串终结符不匹配,弹栈,将栈顶终结符弹出 栈 输入 输出 $E +id*+id$ 出错,跳过+(用户多输入了+) $E id*+id$ id属于first(E) $E ?T id*+id$ $E ?T ?F id*+id$ $E ?T ? id id*+id$ $E ?T ? *+id$ $E ?T ?F* *+id$ $E ?T ?F +id$ 出错:“+”正好在F的同步记号集合中,无须跳过任何记号;F被弹出;(用户少输入了id) $E ?T ? +id$
文档评论(0)