欢迎来到天天文库
浏览记录
ID:56524064
大小:109.00 KB
页数:14页
时间:2020-06-27
《递归下降分析报告程序.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、实验目的:根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。二、程序算法描述这次的实习主要是根据以下文法实现一个递归下降分析器,依据文法如下:(1)E->TG(2)G->+TG
2、-TG
3、ε(3)T->FS(4)S->*FS
4、/FS
5、ε(5)F->(E)
6、i在这个递归下降分析器程序中每一个非终结符E、G、T、S和F构造相应的递归函数,函数的名字表示文法左部的非终结符,函数中就是按文法中每个非终结符右部的候选式依次进行匹配,根据对输入串的分析如果非终结符可以用其中的一个候选式替代就返回
7、1,否则返回0。因为该文法中有五个非终结符,所以定义了五个函数,分别为E(),G(),T(),S()和F()。当输入一串字符串后,就对该字符串进行分析,首先从开始符号分析,所以首先调用E()函数,在E()函数中会调用T()和G(),就是每个非终结符的候选式中出现了哪个非终结符就调用哪个函数。所以,将字符串的第一个字符和E中的每个候选式匹配,如果成功就匹配输入字符串的下一个字符,当最后剩下的字符为’#’时,匹配成功。其实这个工程就是构造一个语法树。程序总流程图如下:图1程序总流程图三、关键性代码这个工程的主要工作用五个非终结符生成的句子是否和输入字符串匹
8、配,所以主要的工作是函数E(),G(),T(),S()和F()的编写。1.对非终结符E处理的函数E()这个函数主要是根据文法中的E->TG,在E()中调用了T()和G()来进行递归分析,这个就是构造生成树的一个分支。intE(){intf,t;//变量printf("E-->TGt");//输出根据的文法flag=1;outDeduce();//输出字符串outputRemain();//输出剩余字符f=T();if(f==0)return(0);//表示当前分析字符可由非终结符T推导出t=G();if(t==0)return(0);//表示当前分析
9、字符可由非终结符G推导出elsereturn(1);}2.对非终结符G处理的函数G()这个函数主要是根据文法中G->+TG
10、-TG
11、ε,在函数中调用了T()和G()函数。将当前字符和候选式的第一个字符进行匹配,如果匹配成功,就调用该候选式中涉及到得第一个非终结符对应的函数,一次递归嵌套调用。如果不是由第一个候选式推出然后依次匹配剩下的候选式。intG(){intf;if(ch=='+'){//当前字符式‘+’b[i1]=ch;printf("G-->+TGt");//说明用的是第一个候选式e[0]='G';e[1]='=';e[2]='>';e[3]
12、='+';e[4]='T';e[5]='G';e[6]='#';Compute();//计算推导式flag=0;outDeduce();//输出字符串outputRemain();//输出剩余字符ch=a[++i1];//读取当前字符的下一个字符if(f==0)return(0);//表示当前分析字符可由非终结符T推导出t=G();if(t==0)return(0);//表示当前分析字符可由非终结符G推导出if(ch=='-'){//当前字符是‘-’b[i1]=ch;printf("G-->+TGt");//说明用的是第二个候选式e[0]='G';e
13、[1]='=';e[2]='>';e[3]='+';e[4]='T';e[5]='G';e[6]='#';Compute();//输出推导式flag=0;outDeduce();//输出字符串outputRemain();//输出剩余字符ch=a[++i1];//读取当前字符的下一个字符f=T();if(f==0)return(0);//表示当前分析字符可由非终结符T推导出G();//判断当前分析字符是否是非终结符G的一个产生式return(1);}printf("G-->^t");e[0]='G';e[1]='=';e[2]='>';e[3]='^
14、';e[4]='#';Compute();//推导式计算flag=1;outDeduce();//输出字符串outputRemain();//输出剩余字符return(1);}3.对非终结符T处理的函数T()函数主要是根据文法中的T->FS,在函数中调用F()和S(),进行递归分析,也是构造语法树的一个分支。intT(){intf,t;printf("T-->FSt");//说明所用的推导式是T-->FSe[0]='T';e[1]='=';e[2]='>';e[3]='F';e[4]='S';e[5]='#';Compute();//推导式计算fla
15、g=1;outDeduce();//输出字符串outputRemain();//输出剩余字符f
此文档下载收益归作者所有