1 / 21
文档名称:

语法分析实验报告.doc

格式:doc   大小:501KB   页数:21页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

语法分析实验报告.doc

上传人:ttteee8 2020/7/14 文件大小:501 KB

下载得到文件列表

语法分析实验报告.doc

相关文档

文档介绍

文档介绍:语法分析试验报告2班孟志锋学号07710158试验目的1、 通过设计编制调试-•个具体的语法分析程序,加深对语法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类语句的分析方法。2、 通过练****掌握对语句进行灵活处理的方法。实验步骤1、 明确语言语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。2、 画出流程图、各函数之间的关系。4、 测试,运行程序打开测试数据文件。设计要求对输入文法,它能判断是否为LL(1)文法,若是,则转(2);否则报错并终止;输入已知文法,由程序自动生成它的LL(1)分析表;对于给定的输入串,应能判断识别该串是否为给定文法的句型。分析该程序可分为如下儿步:读入文法判断正误若无误,判断是否为LL(1)文法若是,构造分析表;由总控算法判断输入符号串是否为该文法的句型。流程图源程序#includc<>#includc<>#inckide<>/*******************************************/intcount=0;/*分解的产生式的个数*/intnumber;charstart;chartermin[50];charnon_tcr[50];charv[50];charleft[50];charright[50][50];/*所有终结符和非终结符的总数*//*开始符号*//*终结符号*//*非终结符号*//*所有符号〃/*左部*//*右部*/charfirst[50][50],fbllow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/charfirst1[50][50];charselect[50][50];charf[50],F[50];charcmpty[20];charTEMP[50];/*所有单个符号的FIRST集合*//*各单个产生式的SELECT集合*//*记荥各符号的FIRST和FOLLOW是否已求过*//*记录可直接推出A的符号*//*求FOLLOW时存放某一符号串的FIRST集合*/intvalidity=l;int11=1;iniM[20J[20J;charchoose;charcmpt[20];/*表示输入文法是否有效*//*表示输入文法是否为LL(I)文法*//*分析表*//*用户输入时使用*//*求_甫】1p()时使用*/charfo[20];/*求FOLLOW集合时使用*//*******************************************判断一个字符是否在指定字符申中intin(charc,char*p)(inti;if(strlen(p)==O)retiini(O);fdr(i=O;;i++)(if(pfi]==c)retum(l); /*若在,返叵1I*/if(i==strlen(p))rctum(O); /*若不在,返M0*/}}/*******************************************得到一个不是非终结符的符号charc()(charc='A';while(in(c,non_ter)==1)C++;retum(c);y*******************************************分解含有左递归的产生式********************************************/voidrecur(chcirpoint)( /*完整的产生式在point[]+*/intj,m=0,n=3,k;chartcmp[20],ch;ch=c(); /*得到一个非终结符*/k=(non_tcr);non_ter[k]=ch;non_ter[k+1]=\0r;ibr(j=0;j<=strlen(poinl)-1;j++)(if(point[nl==point[01)( /*如果‘I’后的首符号和左部相同*/fbr(j=n+1;j<=strlen(point)-1;j++){while(point[j]!=T&&point[j]!=,\0,)temp[m++]=point|j++];left[countj=ch;memcpy(rightfcountLtempjn);right[count][m]=ch;right[count][m+1]=\0r;m=0;counl++;if(poinl|j]==T){n=j+l;break;}}}else{ /*如果‘I’后的首符号和左部不同5*7left[count]=ch;right[count][0]=,A,;right[count][1]=\0,;count++;fbr(j=n;j<=strlen(point)-1;j++)