算符优先分析法研究--附源程序
目 录
1 课程设计的目的和要求2
1.1 课程设计的目的2
1.2 课程设计的要求2
2 系统描述2
2.1 自底向上分析方法的描述:2
2.2 算符优先文法的描述:2
3)输入符号串,进行移进-规约分析。3
3 概要设计3
3.1 设计思路3
3.2 系统功能结构4
3.3 技术路线或实现方法5
3.4 开发环境5
4 详细设计5
4.1 模块划分5
4.2主要算法的流程图7
4.3 数据分析与定义8
4.4 系统界面设计8
5 测试方法和测试结果9
5.1 测试用例19
5.2 测试用例210
5.3测试用例311
5.4 测试用例412
6 结论和展望13
结论13
展望13
学习编译技术课程的体会和对本门课程的评价13
7 参考文献13
8 源代码14
1 课程设计的目的和要求
1.1 课程设计的目的
本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术。
1.2 课程设计的要求
1、文法使用产生式来定义;
2、用大写字母和小写字母分别表示非终结符和终结符;产生式使用->;
3、文法中的空字符串统一使用@表示;
4、分别给出每一个非终结符的FIRSTVT集和LASTVT集;
5、画出算符优先关系表
6、判定给定的文法是否是算符优先文法;
7、给定符号串判定是否是文法中的句子,分析过程用分析表格的方式打印出来。
2 系统描述
本次实验使用windowvisual C++6.0平台,利用,S->#E#
E->E+T
E->T
T->T*F
T->F
F->P/F
F->P
P->(E)
P->i
利用算符优先文法分析过程处理如下:
1)计算给定文法中任意两个终结符对(a,b)之间的优先关系,首先计算两个集合
FIRSTVT(B)={b|B->b…或B->Cb…}
LASTVT(B)={a|B->…a…aC}
表2-1FIRSTVT集和LASTVT集
SE T F P FIRSTVT#+*/i( */i( /i( i( LASTVT #+*/i) */i) /i) i) 2)计算三种优先关系,求出算符优先关系表:
表2-2算符优先关系表
+*/i()#+﹒﹥﹤﹒﹤﹒﹤﹒﹤﹒﹒﹥﹒﹥*﹒﹥﹒﹥﹤﹒﹤﹒﹤﹒﹒﹥﹒﹥/﹒﹥﹒﹥﹤﹒﹤﹒﹤﹒﹒﹥﹒﹥I﹒﹥﹒﹥﹒﹥﹒﹥﹒﹥(﹤﹒﹤﹒﹤﹒﹤﹒﹤﹒﹦﹒)﹒﹥﹒﹥﹒﹥﹒﹥﹒﹥#﹤﹒﹤﹒﹤﹒﹤﹒﹤﹒﹦﹒3)输入符号串,进行移进-规约分析。
3 概要设计
3.1 设计思路
1)首先在源程序相同的目录下创建一个txt文档,并在文档中输入待分析的文法。然后定义一个输入流文件,调用这个流文件中的open函数打开该txt文件,再定义一个二维数组通过循环接收读入的产生式。
2)接着开始构造FIRSTVT、LASTVT、算符优先关系表。在构造表的时候首先定义了两个重要的结构体。一个结构体作为存放具有一定关系的一对非终结符和终结符,另一个结构体作为存放上述元素的栈,包括栈顶指针、栈底指针、栈的长度。既然定义了栈,就存在对栈的初始化、栈是否为空的判断、入栈、出栈操作,利用循环和指针的操作来定义这些函数,以完成元素的进栈和弹出。
定义了这两个结构体,就可以用来构造FIRSTVT、LASTVT、算符优先关系表。在构造FIRSTVT表时,通过循环找出每条产生式中的非终结符的FIRSTVT集,并把该非终结符和终结符压栈,设置标志位,标志一对非终结符和终结符具有对应关系。LASTVT表的构造则是将求FIRSTVT的过程翻转过来,可以仅仅将函数中的参数稍作修改就能够完成。
3)构造算符优先关系表。算符优先关系表是一个二维数组,用来存放任意两个终结符之间的优先关系。首先构造表头,通过扫描所有产生式将终结符不重复的存放在一个一维数组中并置为优先关系表的行和列,并将优先关系表其他内容全部初始化为空。接着遍历所有产生式,找出任意两个终结符之间存在的关系(可以没有关系),并判断任意两终结符是否至多存在一种优先关系,如发现优先关系表不为空,则证明该文法不是算符优先文法,否则,将相应的关系填入到相应的行列对应的单元中。
4)输入串分析过程的设计。首先将大于、小于、等于和无关系分别定义成一种类型的数据表示,通过查询符号栈栈顶以及当前符号之间的优先关系来判断移进和规约的操作。
3.2 系统功能结构
图-1 系统功能结构图