已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include#include#include#define MaxSize1 17/关键字的个数#define MaxSize2 20/运算符的个数#define MaxSize3 4/结束符的个数/数据结构struct TNodechar value20;/存放标识符的值int number; /存放标识符的种别码char description20;/描述KeyWordsMaxSize1,OperationMaxSize2,EndOperationMaxSize3;/存放关键字的数组char *WordsBuffMaxSize1=const,long,float,double,void,main,if,else,then,break,int,char,include,for,while,printf,scanf;/存放运算符的数组char *OperationBuffMaxSize2=+,-,*,/,+=,-=,*=,+,-,=,=,(,),#,;char EndOperationBuffMaxSize3= ,;,n,t;/存放词法分析程序输出的结果TNode Table1500;TNode Variable100;/标识符表TNode Const100;/关键字数组初始化void inputKeyWords(char * buff,int size)/关键字编码从1-sizefor(int i=0;isize;i+)strcpy(KeyWordsi.value,buffi);KeyWordsi.number=i+1;strcpy(KeyWordsi.description,关键字);/运算符数组初始化void inputOperation(char * buff,int size)/运算符编码从50-(50+size)for(int i=0;isize;i+)strcpy(Operationi.value,buffi);Operationi.number=i+50;strcpy(Operationi.description,运算符);/结束符数组初始化void inputEndOperation(char buff,int size)/结束符编码从100-(100+size);for(int i=0;isize;i+)EndOperationi.value0=buffi;EndOperationi.value1=0;EndOperationi.number=i+100;strcpy(EndOperationi.description,结束符);/输出数据结构数组中的信息void outputInfo(TNode a,int size)for(int i=0;isize;i+)printf(%d,ai.number);printf(t);printf(%s),ai.value);printf(t);printf(ai.description);printf(n);void outInfoToFile(TNode a,int size,FILE *out)/将词法分析程序的结果输出到文件中去for(int i=0;isize;i+)fprintf(out,(%d,ai.number);fprintf(out,t);fprintf(out,%s),ai.value);fprintf(out,t);fprintf(out,ai.description);fprintf(out,n);/从文件中读取一个字符/返回文件中读取的字符char getChar(FILE *fp)char ch=fgetc(fp);return ch;/判读是否是运算符int isOperation(char a)/返回i表示是运算符在运算符数组中的位置/返回-1表示不是运算符int result;for(int i=0;iMaxSize2;i+)result=strcmp(a,Operationi.value);if(result=0)return i;break;return -1;/判读是否是关键字int isKeyWords(char a)/返回i表示在关键字表中的位置/返回-1表示不是关键字int result;for(int i=0;iMaxSize1;i+)result=strcmp(a,KeyWordsi.value);if(result=0)return i;break;return -1;/判读是否是结束符int isEndOperation(char a)/返回i表示是结束符在结束符表中的位置/返回-1表示不是结束符for(int i=0;i=a&aA&a=0&a0)strcpy(Table1count.value,KeyWordsa.value);Table1count.number=KeyWordsa.number;strcpy(Table1count.description,KeyWordsa.description);count+;/计数器加一i=0;/清空缓冲区else if(i0)if(isChar(buff0)/是标识符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,标识符);count1+;/计数器加一i=0;/清空缓冲区else if(isDigit(buff0)/是常量strcpy(Constcount2.value,buff);Constcount2.number=count2;strcpy(Constcount2.description,常量);count2+;/计数器加一i=0;/清空缓冲区else/缓冲区为空!/处理回车符与换行符nextchar0=fgetc(in);else if(isEndOperation(nextchar0)!=-1)buffi=0;a=isKeyWords(buff);if(a!=-1&i0)strcpy(Table1count.value,KeyWordsa.value);Table1count.number=KeyWordsa.number;strcpy(Table1count.description,KeyWordsa.description);strcpy(temp,KeyWordsa.value);count+;/计数器加一i=0;/清空缓冲区else if(i0)if(isChar(buff0)/是标识符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,标识符);count1+;/计数器加一i=0;/清空缓冲区else if(isDigit(buff0)/是常量strcpy(Constcount2.value,buff);Constcount2.number=count2;strcpy(Constcount2.description,常量);count2+;/计数器加一i=0;/清空缓冲区else/缓冲区为空!nextchar0=fgetc(in);else if(a=isOperation(nextchar)!=-1)/首先输出缓冲区中的数据buffi=0;a=isKeyWords(buff);if(a!=-1&i0)strcpy(Table1count.value,KeyWordsa.value);Table1count.number=KeyWordsa.number;strcpy(Table1count.description,KeyWordsa.description);count+;/计数器加一i=0;/清空缓冲区else if(i0)if(isChar(buff0)/是标识符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,标识符);count1+;/计数器加一i=0;/清空缓冲区else if(isDigit(buff0)/是常量strcpy(Constcount2.value,buff);Constcount2.number=count2;strcpy(Constcount2.description,常量);count2+;/计数器加一i=0;/清空缓冲区else/缓冲区为空!/处理运算符op0=nextchar0;nextchar0=fgetc(in);if(nextchar0!=)if(isOperation(nextchar)!=-1)op1=nextchar0;if(a=isOperation(op)!=-1)/输出双目运算符strcpy(Table1count.value,Operationa.value);Table1count.number=Operationa.number;strcpy(Table1count.description,Operationa.description);count+;/计数器加一/读取下一个字符nextchar0=fgetc(in);else/错误的双目运算符strcpy(Table1count.value,op);Table1count.number=-1;strcpy(Table1count.description,未定义的运算符);count+;/计数器加一/读取下一个字符nextchar0=fgetc(in);else/输出一元运算符op1=0;a=isOperation(op);strcpy(Table1count.value,Operationa.value);Table1count.number=Operationa.number;strcpy(Table1count.description,Operationa.description);count+;/计数器加一return count;void main()inputKeyWords(WordsBuff,MaxSize1);inputOperation(OperationBuff,MaxSize2);inputEndOperation(EndOperationBuff,MaxSize3);FILE *in,*out;bool Flag=true;while(Flag)printf(源文件的位置:C:input.txtn);if(in=fopen(C:input.txt,r)=NULL)printf(读取源文件失败!n);exit(0);if(out=fopen(C:out.txt,w)=NULL)printf(打开文件失败!n);exit(0);int MaxSize=start1(in);printf(关键字及运算符n);fprintf(out,关键字及运算符n);outputInfo(Table1,MaxSize);outInfoToFile(Table1,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 年秋季开学中小学军训军训磨砺少年意志宣讲课
- 2026年秋季开学幼儿园白露节气文化课件
- 2026年秋季开学初中秋季食品安全与营养课件
- 2026年秋季开学高中开学第一课(快乐成长)课件
- 2026秋沪教版四上英语【单元培优卷】Unit 3 How do we use numbers
- 自动驾驶系统多源异构传感器信息融合关键技术研究
- 行业数据资产识别与分类盘点框架研究
- 数字化转型组织结构与治理模式优化
- 数据资产全生命周期治理体系构建与实践路径
- 2026 年低年资护士病情观察能力带教训练
- 2026年企业财务管理与审计方案
- 2026上海市就业援藏事业单位专项招聘9人笔试题库及参考答案详解(满分必刷)
- 2026年云南省昆明市重点学校初一入学数学分班考试试题及答案
- 医院门诊检验标本采集工作手册
- 西师大版小学二年级上册数学全册教学设计
- 蜘蛛咬伤诊疗规范
- 内蒙古荣达可再生能源发展有限公司建设25kt-a脱硫副产物硫膏、硫渣提纯工业硫磺综合利用项目水土保持报告表
- 警务室规章制度
- 新概念英语55-60课复习
- GB/T 10810.5-2025眼镜镜片第5部分:表面耐磨试验方法
- 外出参加护理会议后汇报
评论
0/150
提交评论