一、实验目的和要求
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。(选做)
根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。(必做)
本次实验的目的主要是加深对自上而下分析法的理解。
二、实验内容
1.功能描述:
LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。
对下列文法,对任意输入的符号串进行分析:
(1)E->TG
(2)G->+TG
(3)G->ε
(4)T->FS
(5)S->*FS
(6)S->ε
(7)F->(E)
(8)F->i
输入一以#结束的符号串(包括+—*/()i#):
输出结果:包括分析栈、数组中的剩余字符串以及所用的产生式,形如:
分析栈 | 剩余输入串 | 所用产生式 |
E | i+i*i# | E->TG |
2.程序结构描述:
2.1参数含义
struct Stack{
char s[30];
int top; //栈顶指针
}S1;
char b[20];
char v1[6]={'i','+','*','(',')','#'};//终结符
char v2[5]={'E','G','T','S','F'};//非终结符
/*用二维数组保存预测分析表,可用符号^来代替ε,注意字符串结束位自动加'\\0' */
2.2返回值描述
void print()/*无返回值 */
intiszhongjie(char X )返回数组下标
intfeizhongjie(char f )返回数组下标
boolchabiao(char X,charsym)bool型返回false和true
2.3函数功能
void print()/*输出分析栈 */
intiszhongjie(char X )判断X是否为终结符,是返回数组下标
intfeizhongjie(char f )判断X是否为非终结符,是返回数组下标
boolchabiao(char X,charsym)判断X是否为非终结符,sym是否为终结符,若是查找预测表对应表格是否为空白,是则出错,否则进栈
fopen 文件打开函数,返回指向文件第一个字符的指针
2.4函数之间的调用关系图
3.程序源代码
//用二维数组保存预测分析表
char table[5][6][4]={{"TG
{"
{"FS
{"
{"i
//查表函数,在预测分析表中判断X是否为非终结符,sym是否为终结符,若是查找预测表对应表格是否为空白,是则出错,否则进栈
匹配失败!"< if (str[0]!='^') { for (inti=strlen(str)-1;i>=0;i--) push(str[i]); cout<<'\'< } 主函数:根据表中的产生式,对栈顶元素根据情况进行移进匹配操作,知道剩余表达式中无非终结符为止,即匹配成功。否则,则匹配失败,给出的字符表达式无法由给定的文法推出。 int main() { printbiao(); file.getline(b,sizeof file); charsym,X; boolflag,cuo; if((fp=fopen("D:\\\\111.txt 读取文件内容,并返回文件指针,该指针指向文件的第一个字符 fprintf(stderr,"读取文件失败!\\n"); exit(1); 把第一个输入符号读进sym X=pop(); if (X=='#') { flag=false; 匹配成功"< else if(iszhongjie(X)!=-1) sym=fgetc(fp);} else if(!chabiao(X,sym)){ cuo=true; } } 三、实验过程记录: 出错次数3次、 出错严重程度不高、 解决办法摘要: 第一次错误是语法错误,加括号改正 第二次读取文件的文件位置写错 第三次是函数调用错误,改错。 实验结果截图: i+i*i# i*(i+i)# 四、实验总结: 本次实验较上次稍难,主要是移近匹配已经判断的思想和流程要充分的理解到位。虽然,老师课上已经讲解了许多,而且实验时也指导了我们一些该注意的地方,但是,在真正编程的过程中还是遇到了许多问题,比如说,如何用一个数组实现让字符串逆序进栈,以及文件的读取和存取内容的相关操作。当然问题最多的还是栈顶元素与剩余字符串的移进匹配过程,这一点我老是搞不太清楚。不过在同学的帮助和指导下这些问题都慢慢的解决了。本次试验共花费了四天时间,历时教长,当然程序中依然存在很多问题,比如对匹配失败的具体原因没有详细显现出来。不过总体来说,使我的编程能力得到了很大的提高。下载本文