一、 程序设计题目与说明
利用递归下降分析方法完成语法分析。
递归下降分析法是一种自顶向下的分析方法,文法的每个非终结符对应一个递归过程(函数)。分析过程就是从文法开始符出发执行一组递归过程(函数),这样向下推导直到推出句子;或者说从根节点出发,自顶向下为输入串寻找一个最左匹配序列,建立一棵语法树。
在不含左递归和每个非终结符的所有候选终结首字符集都两两不相交条件下,我们就可能构造出一个不带回溯的自顶向下的分析程序,这个分析程序是由一组递归过程(或函数)组成的,每个过程(或函数)对应文法的而一个非终结符。这样的一个分析程序称为递归下降分析器。
二、 核心代码(或全部代码)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//递归向下分析方法 识别输入串是不是文法G的句子//如果分析能够达到:所有的非终结符都将展开为终结符并得到匹配
//否则表明输入符号串有语法错误
int index = 0;
char str[50];void E(); //E->TX;
void X(); //X->+TX | e
void T(); //T->FY
void Y(); //Y->*FY | e
void F(); //F->(E) | iint main() { int len;
// int m;
// printf("请输入要测试的次数:");
// scanf("%d",&m);
// while(m--) {
// printf("请输入字符串(长度<50>):\n");
// scanf("%s",str);
// len=strlen(str);
// str[len+1]='\0';
// E();
// printf("%s为合法符号串!\n",str);
// strcpy(str,"");
// index=0;
// }printf("请输入符号串:\n");scanf("%s",str);len=strlen(str);str[len+1]='\0';E();printf("%s为合法句子!\n",str);return 0;
}void E() {T();X();
}
void X() {if(str[index]=='+') {index++;T();X();}
}
void T() {F();Y();
}
void Y() {if(str[index]=='*') {index++;F();Y();}
}
void F() {if(str[index]=='i') {index++;} else if (str[index]=='(') {index++;E();if(str[index]==')') {index++;} else {printf("\n非法的符号串!\n");exit(0);}} else {printf("非法的符号串!\n");exit(0);}
}
三、 测试数据和实验结果分析
四、体会与收获
递归下降分析是直接以程序的方式模拟产生式产生语言的过程。它的基本思想是:为每个非终结符构造一个子程序,每个子程序的函数体按非终结符的候选式分情况展开,遇到终结符直接匹配,遇到非终结符就调用相应的非终结符的子程序。