C语言实现LL(1)文法分析器示例:表达式解析

5星 · 超过95%的资源 需积分: 10 45 下载量 98 浏览量 更新于2024-09-15 4 收藏 8KB TXT 举报
本资源是一份关于使用C语言实现LL(1)分析表的实验模板,主要应用于编译原理的教学实践。LL(1)分析表法是一种左递归、左角非终结符优先的文法分析方法,适用于处理某些简单的上下文无关文法。在这个例子中,文法定义了表达式的结构,包括算术运算符(+、-)、乘除运算、括号以及常量(i)的表示。 文法规则如下: 1. E -> TX (开始符号) 2. X -> +TX | -TX | ε (非终结符X可以是加号后跟TX,减号后跟TX,或者空) 3. T -> FY 4. Y -> *FY | /FY | ε 5. F -> (E) | i (非终结符F可以是左括号和E,或者是直接的常量i) 程序的目标是将输入的表达式,如"3.14*2",转换成形式化语法,例如 "i*i"。在实际处理时,首先通过词法分析阶段识别出数字并用'i'替换,然后根据LL(1)分析表进行语法解析。 代码的关键部分包括定义一个结构体`production`来存储文法的生产规则,如左代码、右代码数组和全部代码字符串。`stack`用于存储解析过程中的符号,`inputstr`保存输入的表达式,而`prods`数组则是预定义的文法规则实例。 `init()`函数初始化文法表,每条规则都包含左代码、右代码列表以及完整的规则字符串。例如,第一条规则E到TX的转换规则被存储为`prods[0]`。 这个模板提供了一个基础框架,学生可以根据这个结构来扩展和实现LL(1)分析器,包括词法分析、扫描输入、堆栈操作以及语法检查等步骤。通过这个实践,可以加深对编译原理的理解,特别是左递归文法分析算法的运用。
2018-09-10 上传
本程序的所用的存储结构都是string类型的,最主要的存储文法的数据结构为自定义结构,里面包括一个产生式的左部,右部以及select集合,至于非终结符的first和follow集合,则是定义了一个string类型的数组进行存储。 本程序的求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),还有一种是经过转换也无法变成LL(1)。 输入文本格式样例: A A->ad A->Bc B->aA B->bB