递归下降分析程序Word格式.docx
《递归下降分析程序Word格式.docx》由会员分享,可在线阅读,更多相关《递归下降分析程序Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
当输入一串字符串后,就对该字符串进行分析,首先从开始符号分析,所以首先调用E()函数,在E()函数中会调用T()和G(),就是每个非终结符的候选式中出现了哪个非终结符就调用哪个函数。
所以,将字符串的第一个字符和E中的每个候选式匹配,如果成功就匹配输入字符串的下一个字符,当最后剩下的字符为’#’时,匹配成功。
其实这个工程就是构造一个语法树。
程序总流程图如下:
图1程序总流程图
三、关键性代码
这个工程的主要工作用五个非终结符生成的句子是否和输入字符串匹配,所以主要的工作是函数E(),G(),T(),S()和F()的编写。
1.对非终结符E处理的函数E()
这个函数主要是根据文法中的E->
TG,在E()中调用了T()和G()来进行递归分析,这个就是构造生成树的一个分支。
intE()
{intf,t;
//变量
printf("
E-->
TG\t"
);
//输出根据的文法
flag=1;
outDeduce();
//输出字符串
outputRemain();
//输出剩余字符
f=T();
if(f==0)return(0);
//表示当前分析字符可由非终结符T推导出
t=G();
if(t==0)return(0);
//表示当前分析字符可由非终结符G推导出elsereturn
(1);
}
2.对非终结符G处理的函数G()
这个函数主要是根据文法中G->
+TG|-TG|ε,在函数中调用了T()和G()函数。
将当前字符和候选式的第一个字符进行匹配,如果匹配成功,就调用该候选式中涉及到得第一个非终结符对应的函数,一次递归嵌套调用。
如果不是由第一个候选式推出然后依次匹配剩下的候选式。
intG()
{intf;
if(ch=='
+'
){//当前字符式‘+’
b[i1]=ch;
G-->
+TG\t"
//说明用的是第一个候选式
e[0]='
G'
;
e[1]='
='
e[2]='
>
'
e[3]='
e[4]='
T'
e[5]='
e[6]='
#'
Compute();
//计算推导式
flag=0;
outDeduce();
ch=a[++i1];
//读取当前字符的下一个字符
t=G();
//表示当前分析字符可由非终结符G推导出
if(ch=='
-'
){//当前字符是‘-’
//说明用的是第二个候选式
Compute();
//输出推导式
G();
//判断当前分析字符是否是非终结符G的一个产生式
return
(1);
}
^\t"
e[0]='
^'
//推导式计算
return
(1);
3.对非终结符T处理的函数T()
函数主要是根据文法中的T->
FS,在函数中调用F()和S(),进行递归分析,也是构造语法树的一个分支。
intT()
{intf,t;
T-->
FS\t"
//说明所用的推导式是T-->
F'
S'
outDeduce();
outputRemain();
f=F();
//表示当前分析字符可由非终结符F推导出
t=S();
//表示当前分析字符可由非终结符S推导出
if(t==0)return(0);
elsereturn
(1);
4.对非终结符S处理的函数S()
函数的主要是文法要求S->
*FS|/FS|ε,在函数中调用F()和S()函数。
其实这个过程和对非终结符G的处理很类似,将当然字符与该非终结符的每个候选式的第一个字符进行匹配。
比如当然字符为‘*’,说明使用第一个候选式,然后调用F()和S()函数进行递归分析。
如果当前字符为‘/’,就使用第二个候选式,然后也调用F()和S()函数进行递归分析。
如果当前字符是在和G中的任何一个候选式的第一个字符都不匹配,就返回1,说明当然字符不能由非终结符G推出。
intS()
{
intf,t;
*'
){//当前字符是‘*’
printf("
S-->
*FS\t"
//说明使用的是第一个候选式
Compute();
flag=0;
ch=a[++i1];
//取出当前字符的下一个字符
f=F();
if(f==0)return(0);
//如果当然分析字符可由非终结符F推出
t=S();
//如果当然分析字符可由非终结符S推出
elsereturn
(1);
if(ch=='
/'
){//当前字符是‘/’
b[i1]=ch;
//说明使用的是第二个候选式
//取出当前字符的下一个字符
//如果当然分析字符可由非终结符F推出
//如果当然分析字符可由非终结符S推出
printf("
e[0]='
flag=1;
a[i1]=ch;
output();
5.对非终结符F处理的函数F()
函数主要是根据文法中给出的F->
(E)|i,在函数中调用E()。
这个过程和前面对其他非终结符的处理差不多,都是根据候选式中涉及的非终结符调用相应的函数。
将当前字符和每一个候选式的第一个字符进行匹配,比如如果当然字符是‘(’,就使用第一个候选式,然后调用E()进行递归向下分析。
如果当前字符是‘i’,就使用第二个候选式。
intF()
('
){//当前字符是‘(’
F-->
(E)\t"
E'
)'
//读取下一个字符
f=E();
//如果当然分析字符可由非终结符E推出
){//当前字符是‘)’
flag=0;
input1();
else{
error\n"
return(0);
}}
elseif(ch=='
i'
){//当前字符是‘i’
i\t"
else
{printf("
return(0);
四、测试结果
这个程序测试时是往命令行中输入一串字符串,来判断该字符串是否是给出文法的一个句型,测试过程窗口中都详细给了出来。
这次我测试的字符串是“i+i*i#”。
截图如下:
如果输入的字符串不是文法的一个句型,窗口中会显示error,说明输入的字符串不正确。
这里我测试的字符串是“i+E”,截图如