- 1、本文档共43页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
例11:消除文法G[A] 的一切左递归。 S→Qc|cQ→Rb|bR→Sa|a 解:终结符排序为:S,Q,R (1)对于S:无直接左递归(不用消除) (2)对于Q:右部不含S开头的产生式 无直接左递归(不用消除) (3)对于R:右部含S开头的产生式,则: S?Qc Q?Rb R?Qca S?c Q?b R?ca R?a 右部含Q开头的产生式: S?Qc Q?Rb R?Rbca S?c Q?b R?bca R?ca R?a 消除直接左递归: S?Qc Q?Rb R?(bca|ca|a)R’ S?c Q?b R’?bcaR’|ε (4) 考察是否存在无用产生式:没有“无用产生式”,所以不用删除。 5.5 确定的自顶向下分析方法 递归子程序法: 主要思想: 对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选时能够按LL(1)形式可唯一地确定选择某个候选进行推导。 优点: 简单、直观、易于构造。(PL/0的语法分析) 缺点: 对文法要求高,必须满足LL(1)文法; 由于递归调用多,速度慢,占用空间多。 5.5 确定的自顶向下分析方法 预测分析法: 预测分析器的组成: 预测分析程序、先进后出栈、预测分析表 预测分析法的步骤: (1)提取左公共因子,消除左递归 (2)判断文法是否为LL(1)文法 (3)若是,构造预测分析表; 否则,不能进行“确定的自顶向下”分析 (4)预测分析程序根据“预测分析表”并利用“分析栈”,对输入串进行分析 例12:文法G[E]: E?E+T|T 构造预测分析表。 T?T*F|F F?i|(E) 解: (1)消除左递归: VN排列为 E,T,F 消除E一切直接左递归: E?TE’ T?T*F F?i E’?+TE’|ε T?F F?(E) 消除T的一切直接左递归: E?TE’ T?FT’ F?i E’?+TE’|ε T’?*FT’|ε F?(E) F没有左递归。 文法无左公共因子。 所以,提取左公共因子和消除左递归后的文法为: E?TE’ T?FT’ F?i E’?+TE’ T’?*FT’ F?(E) E’?ε T’?ε (2)判断改写后的文法是否为LL(1)文法: 可推导出ε的VN表: E E’ T T’ F 否 是 否 是 否 求First集: First(E)={ i , ( } First(E’)={ + , ε } First(T)={ i , ( } First(T’)={ * , ε } First(F)={ i , ( } First( TE’ )=First(T)={ i , ( } First( FT’ )=First(F)={ i , ( } 求Follow集: Follow(E)= { # , ) } Follow(E’)=Follow(E)∪Follow(E’) = { # , )} Follow(T)=(First(E’)-{ε}) ∪Follow(E’)={+, #, )} Follow(T’)= Follow(T)∪Follow(T’) = {+, #, )} Follow(F)=(First(T’)-{ε})∪Follow(T)∪Follow(T’) ={ *, +, #, ) } 求各产生式的SELECT集: SELECT(E?TE’) = First(TE’) = { i , ( } SELECT(E’?+TE’) = First(+TE’) = { + } SELECT(E’?ε ) = Follow(E’) ={ #,)} SELECT(T?FT’) = First(FT’) = { i , ( } SELECT(T’?*FT’) = First(*FT’) = { * } SELECT(T’?ε )= Follow(T’)={ +,#,)} SELECT(F?(E) ) = First((E)) = { ( } SELECT(F?i) = First(i) = { i } 判定: SELECT(E’?+TE’) ∩ SELECT(E’?ε ) = φ SELECT(T’?*FT’) ∩ SELECT(T’?ε ) = φ SELECT(F?(E) ) ∩ SELECT(F?i) = φ ? 所以该文法是LL(1)文法,可以使用预测分析法。 (3)构造预测分析表: 构造预测分析表的方法: 对每个VT或“#”用符号a表示。 若a∈SELECT(A?α),则把A
文档评论(0)