第四章_语法分析(2).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * 4.4.6 预测分析表的构造 算法4.4 预测分析表的构造 输入:文法G 输出:分析表M 方法: (1)对文法的每个产生式A ? ? ,执行(2)和(3)。 (2)对FIRST(?)的每个终结符a,把A??加入M[A, a]。 (3)如果?在FIRST(?)中,对FOLLOW(A)的每个终结符b(包括$),把A ? ?加入M[A, b]。 (4)M的其它没有定义的条目都是error。 * 例4.38 FIRST(E) = FIRST(T) = FIRST(F) = { ( , id } FIRST(E?) = {+, ?} FRIST(T?) = {*, ?} FOLLOW(E) = FOLLOW(E?) = { ), $} FOLLOW(T) = FOLLOW (T?) = { +, ), $} FOLLOW(F) = {+, *, ), $} E ? TE? E? ? + TE? | ? T ? FT? T? ? * FT? | ? F ? (E) | id INPUT SYMBOL id + * ( ) $ E E? T T? F E?TE? T?FT? F?id E??+TE? T?? ? T? ?*FT? F?(E) T?FT? E?TE? T? ? ? E? ? ? E? ? ? T? ? ? * 4.4.7 LL(1)文法 L: Scan input from Left to Right L : Construct a Leftmost Derivation 1 : Use “1” input symbol as lookahead in conjunction with stack to decide on the parsing action 分析表中没有多重定义的表目的文法称为LL(1)文法。 * 例4.19 多重定义的条目 S ? iEtSS? | a S? ? eS | ? E ? b FIRST(S) = { i, a } FIRST(S?) = { e, ? } FIRST(E) = { b } FOLLOW(S?) = FOLLOW(S) ={e, $ } FOLLOW(E) = {t} 非终 结符 输 入 符 号 a b e i t $ S S ? a S ? iEtSS? S? S? ? ? S? ? eS S? ? ? E E ? b * 该文法是具有二义性的:遇到e(else)时不知该选择哪个产生式。 消除二义性 可以只选择S? ? eS ,遵循与e最近的t(then)配对的原则 * LL(1)文法 LL(1)文法中的任何两个产生式A ?? | ? 都满足下列条件: FIRST(? ) ? FIRST(? ) = ? 不存在终结符a,使得? 和? 导出的串都以a开始。 若? ?* ? ,那么FIRST(?) ? FOLLOW(A) = ? ?和? 至多一个能导出空串 如果?导出空串,那么?不能导出以FOLLOW(A)中终结符开始的任何串。 * LL(1)文法 LL(1)文法具有的特殊性质 没有公共左因子 不是二义的 不含左递归 * 4.4.8 出错恢复(Error Recovery) 词法错误 如标识符、关键字或算符的拼写错 语法错误 如算术表达式的括号不配对 语义错误 如算符作用于不相容的运算对象 逻辑错误 如无穷的递归调用 * 分析器对错误处理的基本目标 清楚而准确地报告错误的出现 迅速地从每个错误中恢复过来,以便诊断后面的错误,并尽量少出现伪错误 不应该使正确程序的处理速度降低太多 * 栈顶的终结符和下一个输入符号不匹配 栈顶是非终结符A,输入符号是a,而M[A , a]是空白– No allowable actions 非递归预测分析在什么场合下发现错误 * Panic Mode Recovery(应急方式) 非递归预测分析采用紧急方式的错误恢复,发现错误时,分析器抛弃一些输入记号,直到输入记号属于某个指定的同步记号集合为止。 * 选择同步记号集合的启发式方法 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合中。 if expr then (then是expr的一个同步记号) * 选择同步记号集合的启发式方法 把高层结构的开始符号加到低层结构的同步记号集合中。 assign-stmt := expr ; if … (赋值语句的开始符号作为表达式的同步符号,以免遗漏分号时忽略一大段程序。) * 选择同步记号集合的启发式方法 把FIRST(A)的终结符加入A的同步记号集合。 如果A ?* ?,可以将产生空串的产生式作为默认选择 如果栈顶的终结符不能被

文档评论(0)

yuguanyin2015 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档