实验二递归下降分析法实验报告
实验二 递归下降分析法
一、实验目的和要求
1. 根据某一文法编制递归下降分析程序,以便对任意输入的符号串进行分析。
2. 本次实验的目的是加深对递归下降分析法的理解。
二、实验内容
(1)功能描述
对下列文法,用递归下降分析法对任意输入的符号串进行分析,看是否能匹配成功:
(1)E→TG
(2)G→+TG|-TG
(3)G→ε
(4)T→FS
(5)S→*FS|/FS
(6)S→ε
(7)F→(E) (8)F→i
(2)程序结构描述
本程序的实现方法主要就是函数的递归调用,在程序前面先对文法中所涉及到的非终结符对应的函数进行声明,以免在用到的时候提示函数无声明的错误提示,程序从开始符E开始,根据文法,E可以推出T和G,就在函数E()中调用T()和G(),其他的也是类似,这属于文法中只涉及到非终结符;遇到有终结符的情况则不同,想函数G(),因为G可以推出+TG或者-TG,所以在函数G()中,要分两种情况,先判断当前的字符是否是+,是则调用T()和G(),如果当前字符为-,就调用T()和G(),否则就是ε字符;按照这种方法,把文法所涉及到的非终结符都写成对应的函数,并正确调用其他函数。等所有的函数都描述之后就在mian()里判断当前字符是否分析到结束符#,是则说明此字符串是合法字符,否则说明此字符串为不合法字符。
(3)程序代码
#include
#include
#include
FILE *fp;
char ch;
#define N 20
char string[N];
char *p;
void E();
void T();
void G();
void F();
void S();
void E()
{
}
void F()
{
if(ch=='i') { } else if(ch=='(') { printf(
} } if(ch==')') { } else { } printf(
void G()
{
if(ch=='+') { printf(
} } G(); else if(ch=='-') { } else printf(
void T()
{
}
void S()
{
if(ch=='*') { printf(
} } ch=fgetc(fp); F(); S(); else if(ch=='/') { } else printf(
void main()
{
if((fp=fopen(
} if(ch=='#') { } else { } fclose(fp); printf(
三、实验结果
测试数据一:D盘的一个名为fenxi1.txt的文本文件里文件里输入字符串:(*i)+i#,运行结果如图1所示。
测试数据二:D盘的一个名为ceshi.txt的文本文件里输入字符串:i*i/i#,运行结果如图2所示。
图1 匹配失败
图2 匹配成功
四、实验总结
由于实验之前看过课本和相关知识,所以在写代码的时候比较快,再加之递归下架分析法比较简单,其实质是控制程序比较简单,但由于采用递归的方法,所以执行效率比较低下,当然说的是比起预测法来说。在输入(i)进行测试时还是出错了,在最后,我发现原来是我在求FOLLOW集的时候出现了一个小错误,导致了程序不能得出正确的结果。所以说,在做编译原理的实验时,写代码之前的准备非常重要,不能出错。
调用非终结符E()执行完以后,则对于一些非法的算式还是成功输出例如i*i/i等;解决方案:在主函数main( )中需要对调用非终结符E()执行完以后的ch进行判断,如果ch 为“#”则算式匹配成功,否则算式匹配失败。
本次试验实践使我掌握了递归下降语法分析的基本原理和方法。运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。此分析法简单,直观,易构造分析程序,但是不适于文法过于复杂的,不易检查出错误。