China-pub.com 第5章自底向上的分析 163 下载 5.3.2用于分析冲突的消除二义性规则 SL(1)分析中以及所有的移进-归约分析方法中的分析冲突都可分为两类:移进-归约冲 突和归约-归约冲突。在移进-归约冲突中,有一个自然的消除二义性规则,它总是选取移进 而不是归约,因此大多数的移进-归约分析程序通过选择移进来取代归约,也就自动地解决了 移进-归约冲突。但是归约-归约冲突就要复杂一些了:这样的冲突通常(但并不是总是)指出文 法设计中的一个错误(后面将给出这样冲突的示例)。在移进-归约冲突中选取移进取代归约自 动地合并了用于在if语句中的悬挂els二义性的最近嵌套规则,例5.12就是这样的一个例子。这 是为什么在程序设计语言的文法中仍保留有二义性的一个原因。 例5.12考虑在前面章节中所用到的简化了的语句的文法(例如可参见第3章的34.3节): statement-if-stmt other if-stmt→iE(ep)statement if(exp)statement else statement exD-0 1 由于这是一个有二义性的文法,所以在任何的分析算法中都会出现分析冲突。为了在SLR(I)分 析程序中看到这一点,我们将文法再简化一些使得项目集合的DFA的构造更易处理。甚至还可 将测试表达式全部省略,那么文法就如下所示(它仍包含了悬挂lse二义性): 1→if S|if Selse S 图5-6是项目集合的DFA。构造SLR(1)分析动作需要S和I的Follow集合,它们是 一 ther ot (6 ◆1S 图5-6例5.12中LR(O)项目集合的DFA5.3.2 用于分析冲突的消除二义性规则 S L R ( 1 )分析中以及所有的移进-归约分析方法中的分析冲突都可分为两类:移进-归约冲 突和归约-归约冲突。在移进-归约冲突中,有一个自然的消除二义性规则,它总是选取移进 而不是归约,因此大多数的移进-归约分析程序通过选择移进来取代归约,也就自动地解决了 移进-归约冲突。但是归约-归约冲突就要复杂一些了:这样的冲突通常 (但并不是总是)指出文 法设计中的一个错误 (后面将给出这样冲突的示例 )。在移进-归约冲突中选取移进取代归约自 动地合并了用于在i f语句中的悬挂e l s e二义性的最近嵌套规则,例5 . 1 2就是这样的一个例子。这 是为什么在程序设计语言的文法中仍保留有二义性的一个原因。 例5.12 考虑在前面章节中所用到的简化了的i f语句的文法(例如可参见第3章的3 . 4 . 3节): statement → if-stmt | o t h e r if-stmt → i f ( exp ) s t a t e m e n t | i f ( exp ) statement e l s e s t a t e m e n t exp → 0 | 1 由于这是一个有二义性的文法,所以在任何的分析算法中都会出现分析冲突。为了在 S L R ( 1 )分 析程序中看到这一点,我们将文法再简化一些使得项目集合的 D FA的构造更易处理。甚至还可 将测试表达式全部省略,那么文法就如下所示(它仍包含了悬挂e l s e二义性): S → I | o t h e r I → i f S | i f S e l s e S 图5 - 6是项目集合的D FA。构造S L R ( 1 )分析动作需要S 和I 的F o l l o w集合,它们是 图5-6 例5 . 1 2中L R ( 0 )项目集合的D FA 第 5章 自底向上的分析 1 6 3 下载