版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、词法分析程序文档说明:该词法分析器实现对C语言源代码进行词法分析的功能,由文件输入,将输入的源代码输出为token序列,用二元组形式由文件和屏幕输出,文件输出首先输入源文件路径和文件名称,将注释过滤,能够报告不合法字符,并且记录源代码的行数,单词数(包括关键字,标识符和常量)和字符数(包括字母,数字,标点符号,运算符,空格和换行符)。程序设计:具体见源代码源代码:#include <stdio.h>#include <string>#include <iostream>#include <cstdlib>using namespace std;#
2、define MAX 32char ch =' 'int line=1,zifu=1,word=0;/*line记录行数zifu记录字符数(包括字母,数字,标点符号,运算符,空格和换行符)word记录单词数(包括关键字,标识符和常量)*/ string key32= "auto","break","case","char","const","continue","default","do","double&qu
3、ot;, "else","enum","extern","float","for","goto","if","int","long","register", "return","short","signed","sizeof","static","struct","sw
4、itch","typedef", "union","unsigned","void","volatile","while" ;/c语言中的所有关键字int Iskey(string c) /关键字判断 int i; for(i=0; i<MAX; i+) if(pare(c)=0) /将字符串与关键字一一进行比较 return 1; return 0;int IsLetter(char c) /判断是否为字母 if(c<='z
5、39;)&&(c>='a')|(c<='Z')&&(c>='A') return 1; else return 0;int IsDigit(char c) /判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0;void analyse(FILE *fpin,FILE *fpout) string arr=""string str="" while(c
6、h=fgetc(fpin)!=EOF) zifu+;/将文件中的字符逐一进行扫描,包括字母,数字,标点符号,运算符,空格和换行符 arr="" if(IsLetter(ch)/对开头是字母或数字的字符串进行判断 while(IsLetter(ch)|IsDigit(ch)|ch='_')/符合标识符或者关键字标准的字符串进行判断 if(ch<='Z')&&(ch>='A') ch=ch+32; arr=arr+ch;/将每个单个读取的字符连成字符串 ch=fgetc(fpin); fseek(fpi
7、n,-1L,SEEK_CUR);/不满足条件的多读取的字符回退一格 if (Iskey(arr)/判断字符串是否是关键字 fprintf(fpout,"(%s %s)n",arr.c_str(),"key"); printf("(%s %s)n",arr.c_str(),"key");word+; else/字符串不是关键字则判定为标识符 fprintf(fpout,"(%s %s)n",arr.c_str(),"id"); printf("(%s %s)n&quo
8、t;,arr.c_str(),"id");word+; else if(IsDigit(ch)/开头为数字的串即为常量 while(IsDigit(ch)|ch='.'&&IsDigit(fgetc(fpin) arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); fprintf(fpout,"(%s %s)n",arr.c_str(),"num"); printf("(%s %s)n",arr.c_str(),"num
9、");word+; else switch(ch)/既不是数字也不是字母的符号判定 case'+': ch=fgetc(fpin);/判定+,+=,+ if(ch='+') fprintf(fpout,"(%s %s)n","+","-"); printf("(%s %s)n","+","-");zifu+; if(ch='=') fprintf(fpout,"(%s %s)n","+=&
10、quot;,"-"); printf("(%s %s)n","+=","-");zifu+; else fprintf(fpout,"(%s %s)n","+","-"); printf("(%s %s)n","+","-"); fseek(fpin,-1L,SEEK_CUR); break; case'-' : ch=fgetc(fpin); if(ch='-')
11、/判定-,-=,- fprintf(fpout,"(%s %s)n","-","-"); printf("(%s %s)n","-","-");zifu+; if(ch='=') fprintf(fpout,"(%s %s)n","-=","-"); printf("(%s %s)n","-=","-");zifu+; else fprint
12、f(fpout,"(%s %s)n","-","-"); printf("(%s %s)n","-","-"); fseek(fpin,-1L,SEEK_CUR); break; case'*' : fprintf(fpout,"(%s %s)n","*","-"); printf("(%s %s)n","*","-"); break; ca
13、se'=' : ch=fgetc(fpin);/判定=,= if(ch='=') fprintf(fpout,"(%s %s)n","=","-"); printf("(%s %s)n","=","-");zifu+; else fprintf(fpout,"(%s %s)n","=","EQ"); printf("(%s %s)n","=",&
14、quot;EQ"); fseek(fpin,-1L,SEEK_CUR); break; case'/' : ch=fgetc(fpin);/判定是注释还是运算符/ if(ch='*')/形如/* */的注释,将注释过滤 zifu-; ch=fgetc(fpin); while(ch!='*')&&(ch=fgetc(fpin)='/') ; else if(ch='/')/形如/的注释,将注释过滤 zifu-; ch=fgetc(fpin); while(ch!='n')
15、ch=fgetc(fpin);line+; else fprintf(fpout,"(%s %s)n","/","-"); printf("(%s %s)n","/","-"); fseek(fpin,-1L,SEEK_CUR); break; case '%': fprintf(fpout,"(%s %s)n","%","-"); printf("(%s %s)n","
16、%","-"); break; case '#': fprintf(fpout,"(%s %s)n","#","-"); printf("(%s %s)n","#","-"); break; case '!': ch=fgetc(fpin);/判定!=还是! if(ch='=') fprintf(fpout,"(%s %s)n","!=","-&qu
17、ot;); printf("(%s %s)n","!=","-");zifu+; else fprintf(fpout,"(%s %s)n","!","-"); printf("(%s %s)n","!","-"); fseek(fpin,-1L,SEEK_CUR); break; case '|': ch=fgetc(fpin); if(ch='|')/判定|还是| fprintf(
18、fpout,"(%s %s)n","|","-"); printf("(%s %s)n","|","-");zifu+; else fprintf(fpout,"(%s %s)n","|","-"); printf("(%s %s)n","|","-"); fseek(fpin,-1L,SEEK_CUR); break; case '&
19、9;: ch=fgetc(fpin); if(ch='&')/判定&&还是& fprintf(fpout,"(%s %s)n","&&","-"); printf("(%s %s)n","&&","-");zifu+; else fprintf(fpout,"(%s %s)n","&","-"); printf("(%s
20、 %s)n","&","-"); fseek(fpin,-1L,SEEK_CUR); break; case'(' : fprintf(fpout,"(%s %s)n","(","-"); printf("(%s %s)n","(","-"); break; case')' : fprintf(fpout,"(%s %s)n",")","
21、-"); printf("(%s %s)n",")","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-");
22、 printf("(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case'.' : fprintf(fpout,"(%s %s)n",".","-"); printf(
23、"(%s %s)n",".","-"); break; case',' : fprintf(fpout,"(%s %s)n",",","-"); printf("(%s %s)n",",","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("
24、(%s %s)n","","-"); break; case'' : fprintf(fpout,"(%s %s)n","","-"); printf("(%s %s)n","","-"); break; case '"':fprintf(fpout,"(%s %s)n","引号","-"); printf("(%s
25、 %s)n","引号","-"); break; case '?': fprintf(fpout,"(%s %s)n","?","-"); printf("(%s %s)n","?","-"); break; case':' : fprintf(fpout,"(%s %s)n",":","-"); printf("(%s %s
26、)n",":","-"); break; case'>' : ch=fgetc(fpin); if(ch='=')/判定>=还是> fprintf(fpout,"(%s %s)n",">=","GE"); printf("(%s %s)n",">=","GE");zifu+; else fprintf(fpout,"(%s %s)n","
27、;>","GT"); printf("(%s %s)n",">","GT"); fseek(fpin,-1L,SEEK_CUR); break; case'<' : ch=fgetc(fpin);/判定<=还是<还是<> if(ch='=') fprintf(fpout,"(%s %s)n","<=","LE"); printf("(%s %s)n","<=","LE"); zifu+; else if(ch='>') fprintf(fpout,"(%s %s)n","<>","NE"); printf("(%s %s)n","<>","NE"); zifu+; else
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 图像精准分割
- 2026年中国CNG长管拖车行业市场全景评估及产业需求研判报告
- 2025年郑州中考真题文库及答案
- 投资争端解决的实际操作指南
- 俄罗斯矿山转让协议书
- 22《皇帝的新装》教学课件
- 医疗行业品牌推广策略与礼仪
- 基因的传递教学课件-冀少版生物八年级下册()
- 智能决策系统构建
- 医疗AI辅助治疗
- 2023年开封辅警招聘考试真题含答案详解(完整版)
- 2025年注册监理工程师房建工程延续继续教育试卷及答案
- 散白酒知识培训资料课件
- 《宋崇导演教你拍摄微电影》章节测试题及答案
- 2025年弱电施工考试题目及答案
- 手术室护理核心要点
- 2025年初级社工考试真题及答案
- 九寨沟讲解课件
- 糖尿病护理培训课件
- 2025年顺丰速运全国快递服务区域独家代理合作协议
- 金矿详查实施方案实施方案
评论
0/150
提交评论