编译原理实验采用C 模式编程程序清单及运行结果.docx
- 文档编号:4381106
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:53
- 大小:33.41KB
编译原理实验采用C 模式编程程序清单及运行结果.docx
《编译原理实验采用C 模式编程程序清单及运行结果.docx》由会员分享,可在线阅读,更多相关《编译原理实验采用C 模式编程程序清单及运行结果.docx(53页珍藏版)》请在冰豆网上搜索。
编译原理实验采用C模式编程程序清单及运行结果
#include
#include
#include
#include
usingnamespacestd;
#defineMaxlength20
#defineFILE_NAME_MAX50
#defineNUM2//二进制转换
#defineLT30//'<'
#defineLE31//'<='
#defineNE32//'<>!
='
#defineGT33//'>'
#defineGE34//'>='
#defineEQ35//'='
#defineLB36//'('
#defineRB37//')'
#defineDMU38//'**'
#defineAS40//:
=
#definePS41//+
#defineMI42//-
#defineWH43//'?
'
#defineMU39//'*'
#defineDI46///
#defineCA44//','
#defineBH45//';'
#defineCO47//':
'
#defineDPS48//++
structkeyword{//符号表
char*word;
intvalue;
}keytab[]={
"break",1,
"char",2,
"continue",3,
"do",4,
"double",5,
"else",6,
"extern",7,
"float",8,
"for",9,
"int",10,
"if",11,
"long",12,
"short",13,
"static",14,
"switch",15,
"void",16,
"while",17,
"bool",18,
"false",19,
"true",20,
"sizeof",21,
"FILE",22,
"case",23,
"default",24,
"return",25
};
FILE*fp=NULL,*fpp;
charstr_char[Maxlength];//字符数组str_char,用来依次存放一个单词词文中的各个字符
char*err="该字符未定义!
!
!
\n";
intstrlength=sizeofkeytab/sizeofkeytab[0];//计算keytable数组中的元素数量
intcomp(constvoid*a,constvoid*b);//qsort排序
intcompare_b(constvoid*a,constvoid*b);//besearch查找关键字表
voidinteger(intn);
voiddecimal(doublem);
voidmain(){
intch;
inti;//str_char[i]:
max(i)=Maxlength
doublef;
longn;
keyword*flag;//判断搜索函数是否成功返回
intcountid=70;//关键字的类别码已给出,而标识符类别码统一一码
intcountnum=80;//整型数类别码统一一码
char*filename;
fpp=fopen("schu.txt","w");
filename=(char*)malloc(FILE_NAME_MAX);
printf("请输入文件的名字:
");
while
(1){
scanf("%s",filename);
if(fopen(filename,"r")!
=NULL)
break;
printf("源文件打开失败,请再试一次!
!
!
\n\n请输入文件的名字:
");
}
fprintf(fpp,"<\t\t30\n<=\t\t31\n<>!
=\t\t32\n>\t\t33\n>=\t\t34\n=\t\t35\n(\t\t36\n");
fprintf(fpp,")\t\t37\n**\t\t38\n:
=\t\t40\n+\t\t41\n-\t\t42\n?
\t\t43\n*\t\t39\n/\t\t46\n,\t\t44\n");
fprintf(fpp,";\t\t45\n:
\t\t47\n\n");
for(i=0;i if(keytab[i].value==3) fprintf(fpp,"%s\t%d\n",keytab[i].word,keytab[i].value); else fprintf(fpp,"%s\t\t%d\n",keytab[i].word,keytab[i].value); } fprintf(fpp,"\n\n"); while((ch=fgetc(fp))! =EOF){ fputc(ch,fpp); } fp=fopen(filename,"r"); fprintf(fpp,"\n\n"); qsort(keytab+1,strlength,sizeof(keyword),comp); while((ch=fgetc(fp))! =EOF){ if(isspace(ch))//如果是一个空白字符 continue; elseif(isalpha(ch)){//它必须是一个标识符 str_char[0]=ch; ch=fgetc(fp); i=1; while(isalnum(ch)){//一个字母数字字符 str_char[i]=ch; i++; ch=fgetc(fp); } if(i str_char[i]='\0'; fseek(fp,-1,SEEK_CUR);//撤回 flag=(keyword*)bsearch(str_char,keytab+1,strlength,sizeof(keyword),compare_b); if(flag)//参考关键字 fprintf(fpp,"%s\t(%d,%s)\n",str_char,flag->value,str_char); else//是一个标识符 fprintf(fpp,"%s\t(%d,%s)\n",str_char,countid,str_char); } else fprintf(fpp,"%s",err); } elseif(isdigit(ch)){ str_char[0]=ch; ch=fgetc(fp); i=1; while(isdigit(ch)||ch=='.'){ str_char[i]=ch; i++; ch=fgetc(fp); } if(i { str_char[i]='\0'; fseek(fp,-1,SEEK_CUR);//撤回 if('0'==str_char[0]&&str_char[1]! ='.'&&str_char[1]! ='\0') fprintf(fpp,"%s\t(%s)\n","Invalidnum",str_char);//0是第一个数字 else { fprintf(fpp,"%s\t(%d,",str_char,countnum); f=(double)atof(str_char); if(f<0){ fprintf(fpp,"-"); f=-f; } n=(long)f; if(n==0)fprintf(fpp,"0"); integer(n); if(f-int(f)>1e-9)fprintf(fpp,"."); decimal(f-n);fprintf(fpp,")\n"); } } else fprintf(fpp,"%s",err); } else switch(ch){ case'<': { ch=fgetc(fp); if(ch=='=') fprintf(fpp,"%s\t(%d,%s)\n","<=",LE,"<="); elseif(ch=='>') fprintf(fpp,"%s\t(%d,%s)\n","<>",NE,"<>"); else{ fseek(fp,-1,SEEK_CUR);//撤回 fprintf(fpp,"%c\t(%d,%c)\n",'<',LT,'<'); } break; } case': ': { ch=fgetc(fp); if(ch=='=')fprintf(fpp,"%s\t(%d,%s)\n",": =",AS,": ="); else{ fseek(fp,-1,SEEK_CUR); fprintf(fpp,"%c\t(%d,%c)\n",': ',CO,': '); } break; } case'>': { ch=fgetc(fp); if(ch=='=')fprintf(fpp,"%s\t(%d,%s)\n",">=",GE,">="); else{ fseek(fp,-1,SEEK_CUR); fprintf(fpp,"%c\t(%d,%c)\n",'>',GT,'>'); } break; } case'=': fprintf(fpp,"%c\t(%d,%c)\n",'=',EQ,'=');break; case';': fprintf(fpp,"%c\t(%d,%c)\n",';',BH,';');break; case',': fprintf(fpp,"%c\t(%d,%c)\n",',',CA,',');break; case'(': fprintf(fpp,"%c\t(%d,%c)\n",'(',LB,'(');break; case')': fprintf(fpp,"%c\t(%d,%c)\n",')',RB,')');break; case'-': fprintf(fpp,"%c\t(%d,%c)\n",'-',MI,'-');break; case'+': { ch=fgetc(fp); if(ch=='+')fprintf(fpp,"%s\t(%d,%s)\n","++",DPS,"++"); else{ fseek(fp,-1,SEEK_CUR); fprintf(fpp,"%c\t(%d,%c)\n",'+',PS,'+'); } break; } case'*': { ch=fgetc(fp); if(ch=='*')fprintf(fpp,"%s\t(%d,%s)\n","**",DMU,"**"); else{ fseek(fp,-1,SEEK_CUR); fprintf(fpp,"%c\t(%d,%c)\n",'*',MU,'*'); } break; } case'/': fprintf(fpp,"%c\t(%d,%c)\n",'/',DI,'/');break; case'? ': fprintf(fpp,"%c\t(%d,%c)\n",'? ',PS,'? ');break; default: fprintf(fpp,"(%c)还未定义! ! ! \n",ch);break; } } fclose(fp); fclose(fpp); printf("\t\t程序结果以输出到源程序所在位置,输出文件名: schu.txt! ! ! \n"); } intcomp(constvoid*a,constvoid*b){returnstrcmp(((keyword*)a)->word,((keyword*)b)->word);} intcompare_b(constvoid*a,constvoid*b){returnstrcmp((char*)a,((keyword*)b)->word);} voidinteger(intn){ if(n>0){ integer(n/NUM); fprintf(fpp,"%d",n%NUM); } } voiddecimal(doublem){ staticintt=0; if(m>0&&t<=16){ m*=NUM; t++; fprintf(fpp,"%d",(long)m); decimal(m-(long)m); } 实验结果: <30 <=31 <>! =32 >33 >=34 =35 (36 )37 **38 : =40 +41 -42 ? 43 *39 /46 44 ;45 : 47 break1 char2 continue3 do4 double5 else6 extern7 float8 for9 int10 if11 long12 short13 static14 switch15 void16 while17 bool18 false19 true20 sizeof21 FILE22 case23 default24 return25 inti,j,n; doublesum; n=10.5,mn=20,mm=0123; sum=0.5; for(i=0;i<=n;i+=1) { if(sum<0.2) j++; } int(10,int) i(70,i) (44,,) j(70,j) (44,,) n(70,n) ;(45,;) double(5,double) sum(70,sum) ;(45,;) n(70,n) =(35,=) 10.5(80,1010.1) (44,,) mn(70,mn) =(35,=) 20(80,10100) (44,,) mm(70,mm) =(35,=) Invalidnum(0123) ;(45,;) sum(70,sum) =(35,=) 0.5(80,0.1) ;(45,;) for(9,for) ((36,() i(70,i) =(35,=) 0(80,0) ;(45,;) i(70,i) <=(31,<=) n(70,n) ;(45,;) i(70,i) +(41,+) =(35,=) 1(80,1) )(37,)) ({)还未定义! ! ! if(11,if) ((36,() sum(70,sum) <(30,<) 0.2(80,0.001100110011001) )(37,)) j(70,j) ++(48,++) ;(45,;) (})还未定义! ! ! #include #include #include #definemax50 #defineFILE_NAME_MAX50 intcount=0,L_End=0,flag=1,ll=1,M[max][max]; charStart,End[max],N_End[max],All[max],left[max],right[max][max]; charfirst[max][max],follow[max][max],first_s[max][max],select[max][max]; intflag_first[max],flag_follow[max]; charEmpty[max],p_ded[max],TEMP[max],Follow_tool[max],choose; FILE*fpp; intSearch(charc,char*p); charGetEnd(); voidRecur(char*point); voidN_recur(char*point); charGet_grammer(char*t,char*n); voidMerge(char*d,char*s,inttype); voidZhjtchu_k(charc); intQ_Zhjtchu_k(charc); intJudge_grammer(); voidFIRST_S(inti); voidFIRST(inti,char*p); voidFOLLOW(inti); intJudge_LL(); voidGzao_tab(); voidsyntax(); boolIsN_End(chara); boolJudge(chara,char*str); voidMakeN_Endtab(chartemp[][max],intnumber); voidMakeEndtab(chartemp[][max],intnumber); voidmenu(); voidmain(){ inti,j; char*filename; fpp=fopen("schu.txt","w"); filename=(char*)malloc(FILE_NAME_MAX); printf("请输入文件的名字: "); while (1){ scanf("%s",filename); if(fopen(filename,"r")! =NULL)break; printf("源文件打开失败,请再试一次! ! ! \n\n请输入文件的名字: "); } freopen(filename,"r",stdin); Start=Get_grammer(End,N_End); printf("\n\n@: 表示为ε"); printf("\n\n无左递归和回溯的文法数目: %d,分别是: ",count); for(i=0;i \t%c→%s",i+1,left[i],right[i]); printf("\n开始字符: %c",Start); strcpy(All,N_End); strcat(All,End); printf("\n\n该文法中所有字符: %s",All); printf("\n非终结字符: %s",N_End); printf("\n终结字符: %s\n",End); printf("\nright: "); for(i=0;i printf("\nleft: "); for(i=0;i if(flag==1)flag=Judge_grammer(); printf("\nflag=%d",flag); if(flag==1){ printf(",文法有效! ! ! \n"); ll=Judge_LL(); if(ll==1)printf("\nLL=%d,该文法是一个LL1文法! ! ! \n\n\t预测分析表为: \n",ll); if(ll==0)printf("\nLL=%d,该文法不是一个LL1文法! ! ! \n",ll); else{ Gzao_tab(); printf("\n\t|"); for(i=0;i<=strlen(End);i++)printf("%c\t",End[i]); printf("\n________|"); for(i=0;i printf("\n"); for(i=0;i printf("%c\t|",N_End[i]); for(j=0;j if(M[i][j]>=0) printf("%c→%s\t",N_End[i],right[M[i][j]]); else printf("error\t"); printf("\n"); } menu(); } } fclose(fpp); } charGet_grammer(char*E_str,char*N_str){//读入一个文法 chars,p[max][max]; inti,j,k; printf("请输入文法产生式的条数: "); scanf("%d",&i); printf("%d\n",i); getchar(); printf("请输入文法的开始符号: "); scanf("%c",&s); printf("%c\n",s); for(j=1;j<=i;j++){ printf("请输入文法的第%d条(共%d条)产生式: ",j,i); scanf("%s",p[j-1]); printf("%s\n",p[j-1]); } for(j=0;j if(p[j][1]! ='-'||p[j][2]! ='>'){ printf("\n输入错误! ! ! "); flag=0; return'\0'; }//检测输入错误 MakeN_Endtab(p,i);//存储非终结字符 MakeEndtab(p,i);//存储终结字符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实验采用C 模式编程程序清单及运行结果 编译 原理 实验 采用 模式 编程 程序 清单 运行 结果