您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理词法分析器语法分析课程设计
《编译原理》课程设计院系信息科学与技术学院专业计算机科学与技术年级2014级学号2014111963姓名张正超1词法分析器设计一、设计题目手工设计c语言的词法分析器(可以是c语言的子集)。二、设计内容处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。三、设计目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。四、需求分析4.1.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。4.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。(1)标识符:用户自己定义的名字,常量名,变量名和过程名。(2)常数:各种类型的常数。(3)保留字(关键字):如if、else、while、int、float等。(4)运算符:如+、-、*、、、=等。(5)界符:如逗号、分号、括号等。25.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值)。五、主要源代码#includestdio.h#includestring.h#includectype.h#includestdlib.h#includeassert.h#defineLENGTH110//定义保留字的大小FILE*fp=NULL;//输出流指针FILE*fw=NULL;//输入流指针char/**/character;//字符chartoken[16];//字符数组,用来存放已读入的字符序列//编码表/**/char*CODE[]={identifier/*标识符*/,constant/*常数*/,keyword/*保留字*/,+,-,*,/,,=,,=,!=,==,=,(,),,,:,;,{,}};//保留字表charchar*k[]={for,while,do,else,if,static,int,sizeof,break,continue};//标识符结构体typedefstruct{char*I[256];//标识符数组intlen;//标识符数量}identifier;//常量结构体typedef/**/struct{intcont[300];//存放常量的数组intlen;//常量的数目}constnumber;//读入一个字符,从输入流中读入一个字符到变量character中。voidgetNextChar(FILE*ifp){if((character=getc(ifp))==EOF)exit(1);}3//读入非空白字符,检查变量character中的字符是否为空白字符或回车或换行符。若是,//则调用getNextChar()读入下一个字符,直到character中的字符满足条件.voidgetnbc(FILE*ifp){while(character==''||character=='\n'||character==9){getNextChar(ifp);}}//连接字符串,把character中的字符连接到token数组的结尾。voidconcat(){char*ct=&character;strcat(token,ct);}//判断是否为字母。intletter(){returnisalpha(character);}//判断是否为数字intdigit(){returnisdigit(character);}//回退字符,将刚读入的character中的字符回退到输入流中。并把character中的值置为空。voidretract(FILE*ifp){(ifp-_cnt)++;(ifp-_ptr)--;character='';}//处理保留字,对存放在token中的字符串查保留字,若查到,则返回该保留字的类别编码,否则返回0.intreserve(char**k){inti;for(i=0;iLENGTH1;i++)if(strcmp(token,k[i])==0)returni+1;return0;}4//处理标识符,对存放在token中的字符串查找符号表,若查到,则返回它在符号表的位置,//存入常数表中,并返回它在常数表中的位置编号。intsymbol(identifier*id){inti;for(i=0;iid-len;i++)if(strcmp(token,id-I[i])==0)returni+1;if(id-len256)assert(0);id-I[id-len]=token;id-len++;returnid-len;}//将数字字符串转化为整数。intstrtonumber(){inti;intsum=0;for(i=0;istrlen(token);i++){sum=10*sum+(token[i]-'0');}returnsum;}//存入常数表中,并返回它在常数表中的位置编号。intconstant(constnumber*con){con-cont[con-len]=strtonumber();con-len++;returncon-len;}//将整数值转化为字符串char*numbertoString(intnum){chars[3];inti=num/10;while(i0){charc=i+'0';strcat(s,&c);}returns;}5//将结果写入到文件并且输出到屏幕。voidreturntofile(intnum,intval,identifier*id,constnumber*con){inti;int_num=num;charc;c='(';putc(c,fw);printf(%c,c);i=_num/10;while(i0){_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(i0){_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);}6if(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(num3)//处理界符{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);}}//将错误写入到文件或输出到屏幕voiderror(){printf((ERROR,);printf(%c,character);printf());printf(\n);fputs((ERROR,,fw);putc(character,fw);7putc(')',fw);putc('\n',fw);}//词法分析函数voidLexAnalyze(char**k,char**CODE,identifier*id,constnumber*con,FILE*fp,FILE*fw){intnum,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':8case'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':9case'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=='=')10returntofile(12,0,id,con);elseerror();break;case'+':returntofile(4,0,id,con);break;case'-':returntofile(5,0,id,con);break;case'*':returntofile(6,0,id,con);break;case'/'
本文标题:编译原理词法分析器语法分析课程设计
链接地址:https://www.777doc.com/doc-2069010 .html