编译原理-实验报告_第1页
编译原理-实验报告_第2页
编译原理-实验报告_第3页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序清单1. 分工:2. 词法分析:#include<stdio.h>#include<ctype.h>#include<string.h>#define keywordSum 8char *keywordkeywordSum="if","else","for","while","do","int","read","write"char singleword50="+ - * ( ) ; ,

2、 :"char doubleword10="><=!"extern char Scanin300,Scanout300;extern FILE *fin,*fout;int TESTscan()char ch,token40; int es=0,j,n;printf(" 请输入源程序文件名(包括路径) :"); scanf("%s",Scanin);printf(" 请输入词法分析输出文件名(包括路径): ");scanf("%s",Scanout);if(fin=fope

3、n(Scanin,"r")=NULL)printf("n 打开词法分析输入文件出错! n");return(1);if(fout=fopen(Scanout,"w")=NULL)printf("n 创建词法分析输出文件出错! n"); return(2);ch=getc(fin);while(ch!=EOF)while(ch=' '|ch='n'|ch='t') ch=getc(fin);if(isalpha(ch)token0=ch;j=1; ch=getc(fin

4、); while(isalnum(ch)tokenj+=ch;ch=getc(fin);tokenj='0'n=0;while (n<keywordSum) && strcmp(token,keywordn) n+;if(n>=keywordSum)fprintf(fout,"%st%sn","ID",token);elsefprintf(fout,"%st%sn",token,token);else if (isdigit(ch)token0=ch;j=1;ch=getc(fin);whi

5、le(isdigit(ch)tokenj+=ch;ch=getc(fin);tokenj='0'fprintf(fout,"%st%sn","NUM",token);else if(strchr(singleword,ch)>0)token0=ch;token1='0'ch=getc(fin);fprintf(fout,"%st%sn",token,token);else if (strchr(doubleword,ch)>0)token0=ch;ch=getc(fin);if(token0

6、='!')if (ch = '=')token1=ch; token2='0'ch = getc(fin);fprintf(fout,"%st%sn",token,token);elsetoken1='0'es=1;fprintf(fout,"%st%sn","ERROR",token);elseif (ch = '=')token1=ch; token2='0'ch = getc(fin);elsetoken1='0'fp

7、rintf(fout,"%st%sn",token,token);else if (ch='/')ch = getc(fin);if(ch ='*')char ch1;ch1=getc(fin);doch=ch1; ch1=getc(fin);while(ch!='*' | ch1!='/') && ch1!=EOF);ch = getc(fin);else if(ch='/')doch=getc(fin);while(ch!='n' && ch!

8、=EOF);ch=getc(fin);elsetoken0='/' token1='0'fprintf(fout,"%st%sn",token,token);elsetoken0=ch; token1='0'ch=getc(fin);es = 3;fprintf(fout,"%st%sn","ERROR",token);fclose(fin);fclose(fout);return (es);3. 语法分析:#include<stdio.h>#include<strin

9、g.h>#include<ctype.h>#include<conio.h>int TESTparse();int program();int compound_Stat();int statement();/int expression_Stat();int expression_stat();int expression();int bool_expr();int additive_expr();int term();int factor();int if_stat();int while_stat();int for_stat();int write_sta

10、t();int read_stat();int declaration_stat();int declaration_list();int statement_list();int compound_stat();char token20, token140;/token保存单词符号,token1保存单词值extern char Scanout300;/ 保存词法分析输出文件名FILE * fp;/ 用于指向输入文件的指针#define keywordSum 8char *keywordkeywordSum="if","else","for&q

11、uot;,"while","do","int","read","write"char singleword50="+ - * ( ) ; , :"char doubleword10="><=!"extern char Scanin300,Scanout300;extern FILE *fin,*fout;/ 语法分析程序int TESTparse()int es = 0;if (fp=fopen(Scanout,"r")=N

12、ULL)printf("n打开 %s错误! n",Scanout);es = 0;if (es=0) es=program();printf("=语法分析结果!=n");switch(es)case 0: printf(" 语法分析成功 !n"); break;case 10: printf(" 打开文件 %s失败 !n"); break;case 1: printf(" 缺少 !n"); break;case 2: printf(" 缺少 !n"); break;case

13、3: printf(" 缺少标识符 !n"); break;case 4: printf(" 少分号 !n"); break;case 5: printf(" 缺少 (!n"); break;case 6: printf(" 缺少 )!n"); break;case 7: printf(" 缺少操作数 !n"); break;fclose(fp);return(es);/< 程序 >:=< 声明序列 >< 语句序列 >int program()int es =

14、 0;fscanf(fp, "%s%sn",token,token1);printf("%s%sn",token,token1);if(strcmp(token,"")/ 判断是否为 ''es = 1;return (es);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es = declaration_list();if(es>0) return (es);es = state

15、ment_list();if(strcmp(token, "")/ 判断是否为 ''es = 2;return (es);return(es);/< 声明序列 >:=< 声明序列 >< 声明语句 >|空int declaration_list()int es=0;while(strcmp(token,"int")=0)es=declaration_stat();if(es>0) return (es);return (es);/< 声明语句 >:=int < 变量 > ;i

16、nt declaration_stat()int es=0;fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);if(strcmp(token,"ID")return (es=3);/ 不是标识符fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);if(strcmp(token,"")return

17、(es=4);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);return (es);/< 语句序列 >:=< 语句序列 >< 语句 >|空int statement_list()int es=0;while(strcmp(token,"")es=statement();if(es>0) return (es);return (es);/< 语句 >:=<if/int stateme

18、nt()语句 >|<while <write语句 >|<for 语句 >|<read语句 >|<read语句 >|< 复合语句 >|< 表达式语句 >语句 >int es=0;if(es=0 && strcmp(token,"if")=0) es=if_stat();if(es=0 && strcmp(token,"while")=0) es=while_stat();if(es=0 && strcmp(token,&

19、quot;for")=0) es=for_stat();/ 可在此处添加do 语句调用if(es=0 && strcmp(token,"read")=0) es=read_stat();if(es=0 && strcmp(token,"write")=0) es=write_stat();if(es=0 && strcmp(token,"")=0) es=compound_stat();if(es=0 && strcmp(token,"ID"

20、)=0 | strcmp(token,"NUM")=0)es=expression_stat();/<if语句 >/<while语句 >/<for语句 >/<read语句 >/<write语句 >/< 复合语句 >/ 表达式语句>return (es);/<if语句 >:=if(<int if_stat()表达式 >)< 语句 >|else< 语句 >int es=0;fscanf(fp,"%s%sn",&token,&a

21、mp;token1);printf("%s%sn",token,token1);if(strcmp(token,"(")return (es=5);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=statement();if(es>0) return(es);if(strcmp(token,")") return(es=6);fscanf(fp,"%s%sn",&

22、token,&token1);printf("%s%sn",token,token1);es=statement();if(es>0) return(es);if(strcmp(token,"else")=0)fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=statement();if(es>0) return(es);return(es);/<while语句 >:=while(<

23、; 表达式 >)< 语句 >int while_stat()int es=0;fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);if(strcmp(token,"(")return (es=5);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=expression();if(es>0

24、) return(es);if(strcmp(token,")") return(es=6);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es = statement();return(es);/<for语句 >:=for(< 表达式 >< 表达式 >< 表达式 >)< 语句 >int for_stat()int es=0;fscanf(fp,"%s%sn",

25、&token,&token1);printf("%s%sn",token,token1);if(strcmp(token,"(")return (es=5);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=expression();if(es>0) return(es);if(strcmp(token,"")return (es=4);fscanf(fp,"%s%s

26、n",&token,&token1);printf("%s%sn",token,token1);es=expression();if(es>0) return(es);if(strcmp(token,"")return (es=4);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=expression();if(es>0) return(es);if(strcmp(token,&

27、quot;)")return (es=6);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=expression();return (es);/<write_语句 >:=write< 表达式 >int write_stat()int es=0;fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);

28、es=expression();if(es>0) return(es);if(strcmp(token,"")return (es=4);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);return(es);/<raed_ 语句 >:=read< 变量 >int read_stat()int es=0;fscanf(fp,"%s%sn",&token,&token1);prin

29、tf("%s%sn",token,token1);if(strcmp(token,"ID")return (es=3);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);if(strcmp(token,"")return (es=4);fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,tok

30、en1);return(es);/< 复合语句 >:=< 语句序列 >int compound_stat()/ 复合语句函数int es=0;fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=statement_list();return (es);/< 表达式语句 >:=< 表达式 >|;int expression_stat()int es=0;if(strcmp(token,"")=0

31、)fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);return (es);es=expression();if(es>0) return(es);if(es=0 && strcmp(token,"")=0)fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);return (es);elsees

32、=4;return (es);/ 少分号/< 表达式 >:=< 标识符 >=< 布尔表达式 >|< 布尔表达式 >int expression()int es=0, fileadd;char token220, token340;if(strcmp(token,"ID")=0)fileadd=ftell(fp);/ 记住问件当前位置fscanf(fp,"%s%sn",&token2,&token3);printf("%s%sn",token2,token3);es=boo

33、l_expr();if(es>0) return(es);if(strcmp(token2,"=")=0)/'='fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);elsefseek(fp,fileadd,0);/ 若非=则文件指针回到'=' 前边的标识符printf("%s%sn",token,token1);es=bool_expr();if(es>0) return(es);

34、else es=bool_expr();return (es);/< 布尔表达式 >:=< 算数表达式 >|< 算术表达式 >(>|<|>=|<=|=|!=)/< 算术表达式 >int bool_expr()int es=0;es=additive_expr();if(es>0) return(es);if(strcmp(token,">")=0 | strcmp(token,">=")=0| strcmp(token,"<")=0 | s

35、trcmp(token,"<=")=0| strcmp(token,"=")=0 | strcmp(token,"!=")=0)fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=additive_expr();if(es>0) return(es);return (es);/< 算术表达式 >:=< 项 >(+|-)< 项>int additive_e

36、xpr()int es=0;es=term();if(es>0) return(es);while(strcmp(token,"+")=0 | strcmp(token,"-")=0)fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=term();if(es>0) return(es);return (es);/< 项>:=< 因子 >(*|/)< 因子 >int ter

37、m()int es=0;es=factor();if(es>0) return(es);while(strcmp(token,"*")=0 | strcmp(token,"/")=0)fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=factor();if(es>0) return(es);return (es);/< 因子 >:=(< 表达式 >)|< 标识符 >|&l

38、t; 无符号整数 >int factor()int es=0;if(strcmp(token,"(")=0)fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);es=expression();if(es>0) return(es);if(strcmp(token,")")return (es=6);fscanf(fp,"%s%sn",&token,&token1);printf(

39、"%s%sn",token,token1);elseif(strcmp(token,"ID")=0 | strcmp(token,"NUM")=0)fscanf(fp,"%s%sn",&token,&token1);printf("%s%sn",token,token1);return (es);elsees=7;return (es);/ 缺少操作数return (es);int TESTscan()char ch,token40;int es=0,j,n;printf(&qu

40、ot; 请输入源程序文件名(包括路径):");scanf("%s",Scanin);printf(" 请输入词法分析输出文件名(包括路径)scanf("%s",Scanout);if(fin=fopen(Scanin,"r")=NULL): ");printf("n打开词法分析输入文件出错!n");return(1);if(fout=fopen(Scanout,"w")=NULL)printf("n创建词法分析输出文件出错!n");return(

41、2);ch=getc(fin);while(ch!=EOF)while(ch=' '|ch='n'|ch='t')ch=getc(fin);if(isalpha(ch)token0=ch;j=1;ch=getc(fin);while(isalnum(ch)tokenj+=ch;ch=getc(fin);tokenj='0'n=0;while (n<keywordSum) && strcmp(token,keywordn) n+;if(n>=keywordSum)fprintf(fout,"%st%sn","ID",t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论