消除递归与回溯:文法转换与First/Follow集计算

需积分: 0 0 下载量 137 浏览量 更新于2024-06-18 收藏 6.04MB PDF 举报
"大题速成.pdf" 这篇资料主要讲解了消除递归和回溯的技巧,以及如何求取文法的FIRST集和FOLLOW集,这些都是编译原理中关于上下文无关文法的重要概念。 首先,消除递归是优化文法的一种方法,它有助于简化文法规则,使得解析更加高效。例如,给定的文法形式AsAalps可以通过改为1AspA来消除直接递归。在例题1中,从A'saAk改为A,这样的修改可以避免解析过程中的无限循环。 回溯是在解析过程中遇到错误时返回并尝试其他路径的行为。消除回溯可以使解析过程更有效率。例如,文法BdB可以通过改写为B_dB, BsbBk来避免回溯,这样可以确保解析器按照正确的顺序处理输入。 接下来,资料详细介绍了求解FIRST集和FOLLOW集的步骤。FIRST集是一个非终结符所有可能的起始符号集合,而FOLLOW集是一个非终结符可能出现在句柄后面的符号集合。在求解FIRST集时,需要注意: 1. 文法的起始符号必有井(空字符 ε)。 2. 如果规则A→αBβ,那么FIRST(A)应包含所有α能产生的符号,如果α为空,则将FOLLOW(B)加入到FIRST(A)中。 3. 对于终结符,直接将其写入;对于非终结符,将其加入到相应的FOLLOW集中。 同样,求解FOLLOW集时: 1. 句柄的FOLLOW集包含EOF(文件结束符)。 2. 如果存在规则A→αB,那么FOLLOW(B)应包含所有在A之后可能跟随的符号,即FOLLOW(A)。 文法示例GCA通过消除递归和回溯被改写为GAi, AsaA, A㖄3114, B_dB, B'sb, B'k。然后,给出了求解这些文法的FIRST集和FOLLOW集的例子,如First咖们和FOLLOW㠎的计算。 这份资料提供了一套系统的方法来处理编译原理中的核心问题,对于理解和解决语言分析阶段的挑战非常有帮助。学习者可以通过这些例子和步骤来提高自己在编译技术领域的知识和技能。