词法分析器源代码.doc_第1页
词法分析器源代码.doc_第2页
词法分析器源代码.doc_第3页
词法分析器源代码.doc_第4页
词法分析器源代码.doc_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论