
LL文法的判别和非LL(1)文法的转换,并提供完整可运行的代码。
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
本程序所采用的存储结构均以字符串类型呈现,其中最核心的数据结构用于存储文法信息,它包含产生式的左部、右部以及选择集合。此外,非终结符的first和follow集合则被定义为字符串类型的数组进行存储。本程序所使用的求first、follow和select集合的算法,正是参考了书上所描述的方法:在计算first集合时,仅需分析单个产生式;在计算follow集合时,需要递归地查找每个非终结符的所有后跟字符;而select集合的计算则是在first和follow集合的基础上进行的运算。最终,通过对所有select集合的综合判断,可以确定该文法是否符合LL(1)文法的标准。对于不符合LL(1)文法的产生式,本程序会进行一系列的转换。首先,它会消除左递归现象,随后提取左公因子,并在每一步结束时对产生式进行整合,移除空存储和无法到达的产生式,并置空所有select集合。每次非LL(1)到LL(1)的转换完成后,都需要重新评估文法的性质。如果转换后的文法为LL(1),则程序会跳出循环;否则,继续循环直至达到预设的最大迭代次数。在过程中还会进行决策:是否通过右部替换来优化转换过程——这一步需要人工判断以避免无效替换。提取公因子也同样采用了类似的人工判断机制,旨在防止因无法完全提取文法的左公因子而导致失败的情况发生。最终结果共有三种可能性:一是文法已经转换为LL(1)形式;二是经过转换后仍然不是LL(1)形式;三是经过多次转换仍然无法将其转换为LL(1)形式。输入文本格式样例:AA->adA->BcB->aAB->bB
全部评论 (0)
还没有任何评论哟~


