实验五、 LR分析法实验报告
计算机与信息技术学院
程序功能描述
通过设计、编写和构造LR(0)项目集规范簇和LR 分析表、对给定的符号串进行LR 分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G 出发生成LR(0)分析表,并对给定的
.'
;
符号串进行分析。要求以表格或图形的方式实现。
G[E]: E→aA∣bB A→cA∣d B→cB∣d
设计要求:
(1)构造LR(0)项目集规范簇;要求输入LR(0)文法时,可以直接输入,也可以读取文件,并能够以表格的形式输出项目集规范簇集识别活前缀的有穷自动机(2)构造LR(0)分析表。要求要求输入LR(0)文法时,可以直接输入,也可以读取文件;输出项目集规范簇,可以调用前一处理部分的结果,输出为LR(0)分析表(3)LR(0)分析过程【移进、归约、接受、报错】的实现。要求调用前一部分处理结果的分析表,输入一个符号串,依据LR(0)分析表输出与句子对应的语法树,或直接以表格形式输出分析过程。
主要数据结构描述
数据名称 sc nc SC NC CA excel_action excel_goto state .'
数据类型 int int 字符数组 字符数组 Production数组 Action数组 整型数组 整型数组 数据描述 终结符个数 非终结符个数 存放终结符 存放非终结符 存放产生式 存放Action分析表 存放Goto分析表 状态栈 ;
stack TOKEN current top in num Pcount Pnum Pc P
字符数组 字符数组 int int int int 整型数组 int int Paradigm数组 分析栈 输入序列 当前输入指针 状态栈顶指针 分析栈顶指针 输入串长度 每个状态里项目集数目 产生式个数 状态集个数 存放状态集项目集 程序结构描述
1. 首先要求用户输入规则,并保存,分析出规则的数目,规则里的非终结符号和终结符号等信息,为下一步分析备用。
2. 根据产生式构造分析表,首先分析每个状态里有哪些产生式,逐步将状态构造完整,最后的规约状态数应该等于产生式的个数。
3. 在构造状态的时候,首先将所有的内容均填为出错情况,在每一步状态转换时可以将移进项目填进action表中,对于最后的规约项目,则再用规约覆盖掉之前填的移进。
4. 要求用户输入分析串,并保存在输入序列数组中。
5. 每一步根据当前的状态栈栈顶状态和输入符号查分析表,若是移进,则直接将符号和相应的状态添进栈中,否则弹出与产生式右部相同个数的字符和状态,并用剩下的状态和产生式的左部在goto表中进行查找,将非终结符和得到的状态压入两个栈内。
6. 无论是规约还是移进都要输出当前三个栈内保存内容的情况。
7. 如果碰到acc则输出accept,若碰到error则输出error,否则则继续进行规约和移进,不进行结果输出,直至输出接受或出错。
程序测试:
测试1:E→aA∣bB A→cA∣d B→cB∣d E2aAE2bBA2cAB2cBA1dB1dS0 输入:bcd# 输出:
.'
;
输入二:acccccd# 输出:
.'
;
输入三:acccccd# 输出:
学习总结
对各个栈的操作很容易出错,是直接覆盖掉栈顶的状态还是弹出
几个状态覆盖掉一个状态,对于弹出的状态,原数组当中的内容要清空,出栈入栈的字符数目很容易出错。
构造分析表很难,遇到很多问题,用程序实现比用手工操作要考虑更多的问题,有很多种情况,本实验给的规则比较简单,比如对于E→aA和E→bB,输入a和输入b都只有一个对应产生式可以选择,也没有太长的字符重复多次的序列,但是也要对LR(0)分析法有很
.'
;
熟练的掌握。
实验实现的相当不完善,对着给定的序列写,不够具有通用性,也不够完备,对于程序,我首先将分析表置入,实现了有了分析表如何判定输入序列是否合法的部分,然后再实现输入产生式的功能,分析出终结符和非终结符,实现了分析表横坐标和纵坐标的排序,再实现项目集规范族的状态分析,边分析边构造分析表。
.'
因篇幅问题不能全部显示,请点此查看更多更全内容