如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
实验报告《编译原理》课程预测分析程序设计与实现一、实验目的及要求1.根据文法采用手工方式或程序方式构造预测分析表的构造;2.若采用程序方式构造预测分析表,还需要考察文法、First(α)、Follow(A)的计算机实现,有一定难度,可以给予较高加分;3.必须针对相应预测分析表,设计并实现预测分析总控程序,从而完成一个具有自上而下分析能力的语法分析器(Parser)二、实验内容◆构造该文法的预测分析表◆实现预测分析的总控程序三、实验原理LL(1)文法的判定First集与Follow集的构造预测分析表的设计预测分析总控程序的设计与实现四、文法的定义E→TE’E’→+TE’|εT→FT’T’→*FT’|εF→(E)|i五、实验步骤1.设计上下文无关文法;2.构造该文法的预测分析表;3.设计并实现相应的预测分析总控程序;六、描述核心数据结构和算法。/*函数的定义*/intyuCeFenXi(){charX;/*X变量存储每次弹出的栈顶元素*/chara;/*a变量存储用户输入串的第一个元素*/inti;intcounter=1;/*该变量记录语法分析的步骤数*/init();/*初始化数组*/输出文法做为提示*/提示用户输入将要测试的字符串*/push('#');push('E');输出结果提示语句*/while(1)/*while循环为语法分析主功能语句块*/{输出分析步骤数*/输出格式控制语句*/printStack();/*输出当前栈内所有元素*/X=pop();/*弹出栈顶元素赋给变量X*/printinputString();/*输出当前用户输入的字符串*/if(search(X)==0)/*在终结符集合VT中查找变量X的值,存在返回1,否则返回0*/{if(X=='#')/*栈已经弹空,语法分析结果正确,返回1*/{语法分析结束,输入字符串符合文法定义*/return1;}else{a=inputString[firstCharIntex];if(M(X,a)==1)/*查看预测分析表M[A,a]是否存在产生式,存在返回1,不存在返回0*/{for(i=0;i<13;i++)/*'$'为产生式的结束符,for循环找出该产生式的最后一个元素的下标*/{if(chanShengShi[i]=='$')break;}i--;/*因为'$'不是产生式,只是一个产生式的结束标志,所以i自减1*/while(i>=0){push(chanShengShi[i]);/*将当前产生式逆序压入栈内*/i--;}}else{若预测分析表M[A,a]不存在产生式,说明语法错误*/return0;}}}else/*说明X为终结符*/{if(X==inputString[firstCharIntex])/*如果X等于a,说明a匹配*/{firstCharIntex++;/*输入串的第一个元素被约去,下一个元素成为新的头元素*/}else{return0;}}counter++;}}voidinit(){inti;for(i=0;i<13;i++){inputString[i]=NULL;/*初始化数组inputString[10]*/stack[i]=NULL;/*初始化栈stack[10]*/chanShengShi[i]=NULL;/*初始化数组chanShengShi[10]*/}}七、源程序#include<iostream.h>#include<string.h>#include<stdio.h>charinputString[13];/*用来存储用户输入的字符串,最长为20个字符*/charstack[13];/*用来进行语法分析的栈结构*/intbase=0;/*栈底指针*/inttop=1;/*栈顶指针*/charVT[5]={'i','+','*','(',')'};/*用来存放5个终结符*/charchanShengShi[13];/*用来存放预测分析表M[A,a]中的一条产生式*/intfirstCharIntex=0;/*如果a匹配产生式,则每次firstCharIntex自增1*//*firstCharIntex用来存放用户输入串的第一个元素的下标*/charpop();/*弹出栈顶元素*/intpush(charch);/*向栈内添加一个元素,成功返回