首页 C语言词法分析器

C语言词法分析器

举报
开通vip

C语言词法分析器C语言词法分析器 #include #include #include #include #include #define LENGTH1 10//定义保留字的大小 FILE *fp=NULL;//输出流指针 FILE *fw=NULL;//输入流指针 char character;//字符 char token[16];//字符数组,用来存放已读入的字符序列 //编码表 char *CODE[]={"identifier"/*标识符*/,"constant"/*常数*/,"key...

C语言词法分析器
C语言词法分析器 #include #include #include #include #include #define LENGTH1 10//定义保留字的大小 FILE *fp=NULL;//输出流指针 FILE *fw=NULL;//输入流指针 char character;//字符 char token[16];//字符数组,用来存放已读入的字符序列 //编码 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf char *CODE[]={"identifier"/*标识符*/,"constant"/*常数*/,"keyword"/*保留字 */,"+","-","*","/","<","<=",">",">=","!=","==","=","(",")",",",":",";","{","}"}; //保留字表 char *k[]={"for","while","do","else","if","static","int","sizeof","break","continue"} ; //标识符结构体 typedef struct { char *I[256];//标识符数组 int len;//标识符数量 }identifier; //常量结构体 typedef struct { int cont[300];//存放常量的数组 int len;//常量的数目 }constnumber; //读入一个字符,从输入流中读入一个字符到变量character中。 void getNextChar(FILE *ifp) { if((character=getc(ifp))==EOF) exit(1); } //读入非空白字符,检查变量character中的字符是否为空白字符或回车或换行符。若是, //则调用getNextChar()读入下一个字符,直到character中的字符满足条件. void getnbc(FILE *ifp) { while(character=='?'||character=='\n'||character==9) { getNextChar(ifp); } } //连接字符串,把character中的字符连接到token数组的结尾。 void concat() { char * ct=&character; strcat(token,ct); } //判断是否为字母。 int letter() { return isalpha(character); } //判断是否为数字 int digit() { return isdigit(character); } //回退字符,将刚读入的character中的字符回退到输入流中。并把character中的值置为 空。 void retract(FILE *ifp) { (ifp->_cnt)++; (ifp->_ptr)--; character='?'; } //处理保留字,对存放在token中的字符串查保留字,若查到,则返回该保留字的类别编码, 否则返回0. int reserve(char **k) { int i; for(i=0;ilen;i++) if(strcmp(token,id->I[i])==0) return i+1; if(id->len>256) assert(0); id->I[id->len]=token; id->len++; return id->len; } //将数字字符串转化为整数。 int strtonumber() { // int i; int sum=0; for(unsigned int i=0;icont[con->len]=strtonumber(); con->len++; return con->len; } //将整数值转化为字符串 char * numbertoString(int num) { char s[3]; int i=num/10; while(i>0) { char c=i+'0'; strcat(s,&c); } return s; } //将结果写入到文件并且输出到屏幕。 void returntofile(int num,int val,identifier *id,constnumber *con) { int i; int _num=num; char c; c='('; putc(c,fw); printf("%c",c); i=_num/10; while(i>0) { _num=_num-10*i; c=(i+'0'); printf("%c",c); putc(c,fw); i=_num/10; } c=_num+'0'; printf("%c",c); putc(c,fw); printf(","); putc(',',fw); //如果是标识符或常数则放入括号内。 if(num==1)//处理标识符 { printf("%s",id->I[val-1]); printf(")"); printf("\n"); fputs(id->I[val-1],fw); putc(')',fw); putc('\n',fw); } if(num==2)//处理常数 { _num=con->cont[val-1]; i=_num/10; while(i>0) { _num=_num-10*i; c=(i+'0'); printf("%c",c); putc(c,fw); i=_num/10; } c=_num+'0'; printf("%c",c); printf(")"); printf("\n"); putc(c,fw); putc(')',fw); putc('\n',fw); } if(num==3)//保留字 { printf("-"); printf(")"); printf(" "); printf("#"); printf("%s",k[val-1]); printf("#"); printf("\n"); putc('-',fw); putc(')',fw); fputs(" ",fw); putc('#',fw); fputs(k[val-1],fw); putc('#',fw); putc('\n',fw); } if(num>3) //处理界符 { printf("-"); printf(")"); printf(" "); printf("#"); printf("%s",CODE[num-1]); printf("#"); printf("\n"); putc('-',fw); putc(')',fw); fputs(" ",fw); putc('#',fw); fputs(CODE[num-1],fw); putc('#',fw); putc('\n',fw); } } //将错误写入到文件或输出到屏幕 void error() { printf("(ERROR,"); printf("%c",character); printf(")"); printf("\n"); fputs("(ERROR,",fw); putc(character,fw); putc(')',fw); putc('\n',fw); } //词法分析函数 void LexAnalyze(char **k,char **CODE,identifier *id,constnumber *con,FILE *fp,FILE *fw) { int num,val; strcpy(token,""); getNextChar(fp); getnbc(fp); switch(character) { case'a': case'b': case'c': case'd': case'e': case'f': case'g': case'h': case'i': case'j': case'k': case'l': case'm': case'n': case'o': case'p': case'q': case'r': case's': case't': case'u': case'v': case'w': case'x': case'y': case'z': case'A': case'B': case'C': case'D': case'E': case'F': case'G': case'H': case'I': case'J': case'K': case'L': case'M': case'N': case'O': case'P': case'Q': case'R': case'S': case'T': case'U': case'V': case'W': case'X': case'Y': case'Z': while(letter()||digit()) { concat(); getNextChar(fp); } retract(fp); num=reserve(k);//保留字 if(num!=0) returntofile(3,num,id,con); else { val=symbol(id); returntofile(1,val,id,con); } break; case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': while(digit()) { concat(); getNextChar(fp); } retract(fp); val=constant(con); returntofile(2,val,id,con); break; case'<': getNextChar(fp); if(character=='=') returntofile(9,0,id,con); else { retract(fp); returntofile(8,0,id,con); } break; case'>': getNextChar(fp); if(character=='=') returntofile(11,0,id,con); else { retract(fp); returntofile(10,0,id,con); } break; case'=': getNextChar(fp); if(character=='=') returntofile(13,0,id,con); else { retract(fp); returntofile(14,0,id,con); } break; case'!': getNextChar(fp); if(character=='=') returntofile(12,0,id,con); else error(); break; case'+': returntofile(4,0,id,con); break; case'-': returntofile(5,0,id,con); break; case'*': returntofile(6,0,id,con); break; case'/': returntofile(7,0,id,con); break; case'(': returntofile(15,0,id,con); break; case')': returntofile(16,0,id,con); break; case',': returntofile(17,0,id,con); break; case':': returntofile(18,0,id,con); break; case';': returntofile(19,0,id,con); break; case'{': returntofile(20,0,id,con); break; case'}': returntofile(21,0,id,con); break; default: error(); } } int main(int argc,char *argv[]) { //初始化标识符和常数结构体 identifier *id=(identifier*)malloc(sizeof(identifier)); constnumber *con=(constnumber*)malloc(sizeof(constnumber)); con->len=0; id->len=0; argc=3; argv[1]="待分析.txt";//待分析的文件 argv[2]="分析结果.txt";//保存分析结果的文件 //从打开目标文件流 if((fp=fopen(argv[1],"r"))==NULL) { printf("cat:can't open%s\n",*argv); return 1; } //打开要写二元式的文件流 if((fw=fopen(argv[2],"w"))==NULL) { printf("cat:can't open %s\n",argv[2]); return 1; } while(!feof(fp)) { LexAnalyze(k,CODE,id,con,fp,fw);//执行词法分析 } //关闭流 fclose(fp); fclose(fw); return 0; }
本文档为【C语言词法分析器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_435706
暂无简介~
格式:doc
大小:35KB
软件:Word
页数:18
分类:
上传时间:2017-09-26
浏览量:12