1 / 40
文档名称:

编译原理语法分析实验报告.doc

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

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

分享

预览

编译原理语法分析实验报告.doc

上传人:一花一叶 2019/3/22 文件大小:153 KB

下载得到文件列表

编译原理语法分析实验报告.doc

文档介绍

文档介绍:薂编肇译螇原薄理节实腿验袅报肄告羃 膀芇 班级:计科0702蒃 姓名:宝旭程螃 学号:05羇 指导老师:(1)对输入文法,它能判断是否为LL(1)文法,若是,则转(2);否则报错并终止;薆(2)输入已知文法,由程序自动生成它的LL(1)分析表;羀(3)对于给定的输入串,应能判断识别该串是否为给定文法的句型。:羅(1)读入文法螀(2)判断正误羇(3)若无误,判断是否为LL(1)文法羅(4)若是,构造分析表;蒅(5)由总控算法判断输入符号串是否为该文法的句型。蒁罿有效? 是螈蚃是LL(1)文法?蚂衿袆结束莆报错蒂判断句型 /*******************************************蚃语法分析程序袁#include<>袈#include<>肄#include<>蒄intcount=0;/*分解的产生式的个数*/蚈intnumber;/*所有终结符和非终结符的总数*/羆charstart;/*开始符号*/薃chartermin[50];/*终结符号*/袀charnon_ter[50];/*非终结符号*/蝿charv[50];/*所有符号*/肅charleft[50];/*左部*/羂charright[50][50];/*右部*/蚀charfirst[50][50],follow[50][50];/*各产生式右部的FIRST和左部的FOLLOW集合*/螁charfirst1[50][50];/*所有单个符号的FIRST集合*/蒇charselect[50][50];/*各单个产生式的SELECT集合*/蚆charf[50],F[50];/*记录各符号的FIRST和FOLLOW是否已求过*/莁charempty[20];/*记录可直接推出^的符号*/薈charTEMP[50];/*求FOLLOW时存放某一符号串的FIRST集合*/薅intvalidity=1;/*表示输入文法是否有效*/肅intll=1;/*表示输入文法是否为LL(1)文法*/膁intM[20][20];/*分析表*/虿charchoose;/*用户输入时使用*/羈charempt[20];/*求_emp()时使用*/蒅charfo[20];/*求FOLLOW集合时使用*/袂intin(charc,char*p)蚁{肆 inti;羄 if(strlen(p)==0)薂 return(0);蒈 for(i=0;;i++)葿 { 莃 if(p[i]==c)莂 return(1);/*若在,返回1*/薀 if(i==strlen(p))薇 return(0);/*若不在,返回0*/螃 }肃}薁charc()蚅{蒆 charc='A';袃while(in(c,non_ter)==1)莈 c++;肈 return(c);袅}薃voidrecur(char*point)蒀{/*完整的产生式在point[]中*/膆intj,m=0,n=3,k;莅 chartemp[20],ch;肀 ch=c();/*得到一个非终结符*/薁 k=strlen(non_ter);薈 non_ter[k]=ch;螄 non_ter[k+1]='\0';螀 for(j=0;j<=strlen(point)-1;j++)莈 { 蚇 if(point[n]==point[0])膄{/*如果‘|’后的首符号和左部相同*/薁 for(j=n+1;j<=strlen(point)-1;j++)莀{螅 while(point[j]!='|'&&point[j]!='\0')蚃 temp[m++]=point[j++];芁 left[count]=ch;蒁 memcpy(right[count],temp,m);膈 right[count][m]=ch;肂 right[count][m+1]='\0';肁 m=0;芈 count++;芆 if(point[j]=='|')螆{螂 n=j+1;芀 break;蚈}膅}薂}肇 else螇{/*如果‘|’后的首符号和左部不同*/薄 left[count]=ch;节 right[count][0]='^';腿 right[count][1]='\0';袅 count++;肄 for(j=n;j<=strlen(point)-1;j++)羃{膀 if(point[j]!='|')芇 temp[m++]=point[j];蒃 else螃{羇 left[count]=point[0];莆 memcpy(right[count],temp,m);袃 right[count][m]=ch;