1、1. 了解单词(内部编码)符号串中的短语句型结构形成规律。2. 理解和掌握语法分析过程中语法分析思想(LL,LR)的智能算法化方法。二实验环境Windows xp计算机一台,装有c+程序三、实验内容与步骤1、根据某一文法编制调试 LL ( 1 )分析程序,以便对任意输入的符号串进行分析;2、构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序;3、分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。 步骤:1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。2、如果遇到错误的表达式,应输出错误提示信
2、息。3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)S-TE(2)E-+TE|$(3)T-FM(4)M-*FM|$(5)F-(E)|i#四、实验过程与分析(一)设计思想(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。(二)分析的流程图实验分析:#includestdlib.hint vnNum,gramma
3、rNum,vtNum=6;int order;int count=1;char Grammar2010,BlankTerminate202;char First54=S,(i0, E+$TM*F;char Follow56=)#char Select84=int IndiBlanket67;char VT10=typedef struct char *base; char *top; int stacksize;AnalStack;AnalStack S;int ScanGrammar() FILE *fp=fopen(文法.txt,r); FILE *tp; char singleChar,
4、nextChar; int i=0,j=0; while(!feof(fp) fscanf(fp,%c,&singleChar); if(singleChar=) Grammarij=; break; n i+; j=0; continue;- tp=fp; fscanf(tp,nextChar); if(nextChar= fp=tp; continue; | Grammari+10=Grammari0; i+; j=1; Grammarij=singleChar; j+; / printf(输入的文法:n for(int k=0;k/ printf(,Grammarkj); j+;%dn,
5、i); fclose(fp); return i;int Fill(char gi,char sij,int grammarOrder) int i,j; for(i=0;ivnNum;i+) if(Firsti0=gi)break; j=0; while(VTj! if(VTj=sij)break; IndiBlanketij=grammarOrder; return 0;int Indicate() for(j=0;jvtNum;j+) IndiBlanketij=-1;=grammarNum; while(Selectij! Fill(Grammari0,Selectij,i); pri
6、ntf(预测分析表如下: printf(%3d,IndiBlanketij); printf(int Terminate_$(int grammarNum) int j=0; int count; for(int i=0; BlankTerminatei1=0 BlankTerminate00=Grammar00; if(Grammar01= BlankTerminate01=1 count=1; for(i=1;count; if(Grammari0=BlankTerminatej0) if(Grammari1= BlankTerminatej1= break; if(j=count) Bl
7、ankTerminatecount0=Grammari0; if(Grammari1= BlankTerminatecount1= count+; count-;$的终结符表: /*j;%c:%cn,BlankTerminatei0,BlankTerminatei1); */ return count;AnalStack InitStack() S.base=(char *)malloc(100*sizeof(char); if(!S.base)exit(1); S.top=S.base; S.stacksize=100; *S.top= S.top+; return S;int Print(
8、char AnalStr,int i,int sign) int startpos=i;%dt,count); count+; char *p=S.base; while(p!=S.top+2),*p); p+;t while(AnalStri!,AnalStri);tt if(sign=0) int j=0; while(Grammarorderj!,Grammarorderj); if(j=0)printf( if(sign=1)%c匹配n,AnalStrstartpos);int Push(char topChar,char curChar,int sign,int ii,char An
9、alStr) if(Firsti0=topChar)break; if(VTj=curChar)break; order=IndiBlanketij; Print(AnalStr,ii,sign); j=1; while(Grammarorderj! j+; j-; while(j!=0) if(Grammarorderj! S.top+; *S.top=Grammarorderj; j-;int Analysis() int i=0; int sign=0; int count=1; char curChar; InitStack(); char AnalStr10=输入产生式: scanf
10、(%sAnalStr);步骤t分析栈t剩余输入串t产生式n sign=0; curChar=AnalStri; char *p=S.top; char topChar=*p; S.top-; if(topCharZ if(topChar=curChar) sign=1; Print(AnalStr,i,sign); i+; else printf(Analysis ERROR! return 0; if(topChar= break; return 0; else Push(topChar,curChar,sign,i,AnalStr);预测分析成功!int main() int i,m; grammarNum=ScanGrammar(); vnNum=Terminate_$(grammarNum);Select集: m=0; while(Selectim! /printf(%c ,Selectim); m+;/ printf( Indicate(); Analysis();实验结果:五、实验总结经过本次的实验,使我真正的了解语法分析器的实现过程,让我更加深刻的语法分析器的实现原理,虽然在本次试验中遇到了各种各样的困难和错误,但在同学的帮助下还是把错误改正过来了,是的语法分析器能够正确的识别相应的语法和表达式。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2