版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 统编版语文九年级上册第19课《怀疑与学问》公开课一等奖创新教学设计
- 3《 鸿门宴》公开课一等奖创新教学设计统编版高中语文必修下册
- 4 场景歌 公开课一等奖创新教学设计(2课时)
- 第三单元 课外古诗词诵读(公开课一等奖创新教学设计)-七年级语文上册同步高效课堂(统编版2024)
- 跨模态全息存储与检索技术
- 无息贷款与交通出行成本优化
- 石棉暴露的肺部成像生物标志物
- 2024外贸销售合同中英文版本
- 2024年年监理工程师合同管理练习题
- 2024年家政劳务合同范本
- 煤矿隐蔽致灾因素普查报告
- 中学思想政治课程标准及教材分析(初中)课件
- 车间班组长岗位竞聘答辩报告课件
- 企业内部控制风险清单
- 相交线优秀课件
- 初中写作指导课件:以尊重为题作文
- 串联和并联-完整版课件
- 英语科技文献的查阅、论文撰写与投稿课件
- 透析患者左心衰护理个案
- 最全BSCI长期目标综合计划
- 刀具全寿命周期管理系统详细设计V10
评论
0/150
提交评论