词法分析器(计算机系要的).doc_第1页
词法分析器(计算机系要的).doc_第2页
词法分析器(计算机系要的).doc_第3页
词法分析器(计算机系要的).doc_第4页
词法分析器(计算机系要的).doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*本程序用于词法分析:从DOS界面输入一行的C语句,并以#号结尾(注意必须以这个为结束标志,否则出错),要求输出对应的单词的种类码和该类中的 内码。其中,关键字种类为1,分界符种类为2,算术运算符、关系运算符、常数、标识符分别为3、4、5、6。 问题:记得对给指针分配内存,否则会出现异常! 作者:02级计算机4班:chenyiyin于2005年4月13日 Email:*/#include#include#includechar * key8=BEGIN,DO,ELSE,END,IF,THEN,VAR,WHILE;/*存放关键字*/char * identify20; /*存放标识符*/char * constant20; /*存放常数*/int id=0; /*全局变量,用于表示标识符的个数*/int cd=0; /*用于表示常数的个数*/int Is_number(char ch) /*是否是数字*/ return (ch=0&ch=a&ch=A&ch=Z);void Key_analyse(char * str) /*关键字和标识符的分析*/ int i=0; int j=0; for(;i8;i+) /*如果和关键字数组中的一个字相同则表示它为关键字*/ if(strcmp(str,keyi)=0) /*比较*/ j=1; printf(%stype,number-1,%dn,str,i); /*输出种类和内码*/ if(j!=1) /*j=1则表示它已经是关键字,否则就是标识符*/ int i=0; for(;iid;i+) /*和常数表中比较,若表中已经存在这个常数*/ /*则不再添加到表中,否则加入表中。*/ if(strcmp(identifyi,str)=0)break; printf(%s type,number-6,%dn,str,i); if(i=id) identifyid=(char*)malloc(sizeof(str); strcpy(identifyid+,str); void Constant_analyse(char *str) /*常数分析*/ int i=0; for(;icd;i+) if(strcmp(constanti,str)=0) break; /*和标识符分析同理*/ printf(%s type,number-5,%dn,str,i); if(i=cd) constantcd=(char*)malloc(sizeof(str); strcpy(constantcd+,str); void Error_out(char * str) printf(Error! %sn,str);void main() char input100; /*存放输入的字符串*/ char ch10; /*存放用于分析的单词*/ int input_i=0; int ch_i=0; int m; int n; printf(Please input a file name to analyse:n); gets(input); /*输入*/k: chch_i=inputinput_i; while(chch_i= ) /*当是空格则继续从input中取值*/ chch_i=input+input_i; if(Is_alphe(chch_i) /*当第一个为字母时,可以肯定它组成的单词*/ /*不是关键字就是标识符。*/ while(Is_number(inputinput_i+1)|Is_alphe(inputinput_i+1) ch+ch_i=input+input_i; /*后面可以跟字母或数字*/ ch+ch_i=0; /*若不是字母或数字就表示这是个单词,结束取数。*/ Key_analyse(ch); /*分析是关键字还是标识符。*/ else /*如果第一个不是字母,那么它组成的单词*/ /*可能是常数或符号。*/ if(Is_number(chch_i) while(Is_number(inputinput_i+1) /*取常数单词。*/ ch+ch_i=input+input_i;if(Is_alphe(inputinput_i+1) Error_out(It is not a number!); return; ch+ch_i=0; Constant_analyse(ch); /*常数分析*/ else /*符号分析*/ switch(chch_i) case , : printf(%c type,number-2,0n,chch_i);break; case ; : printf(%c type,number-2,1n,chch_i);break; case . : printf(%c type,number-2,2n,chch_i);break; case : : if(inputinput_i+1= ) printf(:= type,number-2,3n);break; case ( : printf(%c type,number-2,4n,chch_i);break; case ) : printf(%c type,number-2,5n,chch_i);break; case + : printf(%c type,number-3,10n,chch_i);break; case - : printf(%c type,number-3,11n,chch_i);break; case * : printf(%c type,number-3,20n,chch_i);break; case / : printf(%c type,number-3,21n,chch_i);break; case : if(inputinput_i+1=) printf() printf( type,number-4,00n,chch_i); else printf(%c type,number-4,05n,chch_i);break; case = : printf(%c type,number-4,02n,chch_i);break; case : if(inputinput_i+1=) printf(= type,number-4,04n); else printf(%c type,number-4,03n,chch_i);break; default: printf(Error! You enter the wrong words!); goto end; /*都不是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论