5第五章 自底向上语法分析法2.pdfVIP

  • 11
  • 0
  • 约7.7千字
  • 约 43页
  • 2018-10-19 发布于山东
  • 举报
主要内容 自底向上分析概述 LR(0)分析 SLR(1) 分析 LR(1)和LALR(1)分析 Yacc :一个LALR(1)分析程序的生成器 使用Yacc生成TINY分析程序 自底向上分析程序中的错误校正 确定化NFA图得DFA图 因该文法属非LR(0)文法,输入串n+n+n,无法分 析下去,如何解决? 解决方法:通过超前查看输入串的下一个记号。 具体做法: (1)在一个移进之前先考虑输入记号以确保存在 着一个恰当的DFA。 (2 )使用非终结符的Follow集合来决定是否应 执行一个归约。 注意:先行的这个简单应用的能力强大得足以分 析几乎所有的一般的语言构造。 SLR(1)分析算法(SLR(1) parsing algorithm , 简单LR(1)分析) 使用了LR(0)项目集合的DFA。 只是在构造分析表的时候才考虑超前查看输入串 的一个符号。 Follow(E’) ={$},在状态1时,输入+则移进,输入$时则 归约。在如下SLR (1)分析表中,移进由表项中的字母s 指出,归约由字母r 指出。 SLR(1)分析过程与 LR(0)分析过程类似 (即图的遍历), 通过查表进行相应 的处理。符号串 n+n+n的SLR(1)分 析过程如下: • SLR(1)分析过程总结: SLR(1)分析算法:令s 为当前状态(位于分析栈的顶部) 。 则动作可定义如下: 1. 若状态s 包含了格式A→.X的任意项目,其中X是一 个终结符,且X是输入串中的下一个记号,则动作将当前 的输入记号移进到栈中,且被压入到栈中的新状态是包含 了项目A→X .的状态。 2. 若状态s 包含了完整项目A→.,则输入串中的下一个 记号是在Follow(A)中,所以动作是用规则A→归约。用 规则S’→S 归约与接受等价(其中S是开始状态),这只 有当下一个输入记号是$时,这才会发生。在所有的其他 情况中,新状态都是如下计算的:从分析栈删除串和它 的所有对应状态。相对应地,DFA回到开始构造的状态。 通过构造,这个状态必须包括格式B→.A的一个项目。 将A压入到栈中,并将包含了项目B→A.的状态压入。 3. 若下一个输入记号都不是上面两种情况所提到的,则声 明一个错误。 • SLR(1)存储结构——SLR(1)分析表 与LR(0)分析表的对比,两者的差别如下: (1)由于状态在SLR(1)分析程序中可以具有移 进和归约(取决于先行),使得动作和规则列成为 多余。 (2 )由于输入结束符号$也可成为一个合法的先 行,所以必须为这个符号在输入部分建立一个新 的列。 文法: S’→S S→( S ) S | 在状态0、2和4 中, (1)规约项S→.,其Follow (S) = { $ , ) } (2 )移进项S→.(S)S的下一个符号为( • SLR(1)分析法的问题1 试用SLR(1)分析法进行if语句文法所对应输入串 的分析。 statement →if-stmt | other if-stmt →if ( exp ) statement| if (exp) statement else statement exp →0 | 1 为了便于后续处理,先简化文法: S →I | other I →if S | if S else S 可得LR (0 )项DFA图: 该文法属非SLR(1)文法。在状态5中,对于归约项, Follow (I) = {$, else};对于移近项,下一个符号为else 。 只做移进不做归约解决移进-归约冲突,进而消除二义性。 为了在SLR(1)分析表中描述方便,对文法规则进 行了编号: (1) S →I (2) S →other (3) I →if S (4) I →if S else S 已删除了分析冲突的SLR(1)分析表如下: • 结论:在SLR(1)分析中消除二义性规则 SLR(1)分析中以及所有的移进-归约分析方法中的 分析冲突都可分为两类:移进-归约冲突和归约- 归约冲突。 冲突消除方法: (1)在移进-归约冲突中,有一个自然的消除二 义性规则,它总是选取移进而不是归约,因此大 多

文档评论(0)

1亿VIP精品文档

相关文档