已阅读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
- 2025松桃苗族自治县中等职业学校工作人员招聘考试试题
- 2025景德镇陶瓷职业技术学院工作人员招聘考试试题
- 基坑边坡喷锚支护施工技术方案
- 2026年全球航空货运市场分析报告
- 2026年清洁能源产业趋势报告
- 2026年食品智能供应链报告
- 跨境数字营销平台在2025年金融行业的应用场景与可行性分析
- 城市地下管网地理信息系统在智慧城市公共安全领域的2025年应用可行性
- 公募行业季度综述
- 医学课题申报书技术指标
- 交通安全协管员考试题库及答案解析
- 地铁区间高架桥施工安全风险评估及改进方案
- 2024煤矿地质工作细则
- 苏州文华东方酒店公区概念设计方案文本
- 2025年安徽中烟工业公司岗位招聘考试笔试试卷(附答案)
- 2025中小学教师考试《教育综合知识》试题及答案
- 暖通可行性研究报告
- (国网)社会单位一般作业人-网络信息安全准入考试复习题及答案
- 员工异地办公管理制度
- sm指数测试试题及答案
评论
0/150
提交评论