1 / 40
文档名称:

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

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

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

分享

预览

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

上传人:一花一世 2019/4/1 文件大小:153 KB

下载得到文件列表

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

文档介绍

文档介绍:蒂编羂译羈原蒆理袅实莁验螈报芃告羃 螁葿 班级:计科0702莅 姓名:宝旭程肁 学号:0708030225芀 指导老师:(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