当前位置:文档之家› 编译原理课程设计-词法分析器(附含源代码)

编译原理课程设计-词法分析器(附含源代码)

编译原理-词法分析器的设计一.设计说明及设计要求一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。

本课程设计即为词法分析阶段。

词法分析阶段是编译过程的第一个阶段。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。

如保留字(关键字或基本字)、标志符、常数、算符和界符等等。

二.设计中相关关键字说明1.基本字:也称关键字,如C语言中的 if , else ,while , do ,for,case,break, return 等。

2.标志符:用来表示各种名字,如常量名、变量名和过程名等。

3.常数:各种类型的常数,如12,6.88,和“ABC”等。

4.运算符:如 + ,- , * , / ,%, < , > ,<= , >= 等。

5.界符,如逗点,冒号,分号,括号,# ,〈〈,〉〉等。

三、程序分析词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词序列,用以语法分析。

词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。

然而,更一般的情况,常将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。

词法分析程序每得到一次调用,便从源程序文件中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。

四、模块设计下面是程序的流程图五、程序介绍在程序当前目录里建立一个文本文档,取名为infile.txt,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。

程序结果输出在同一个目录下,文件名为outfile.txt,此文件为自动生成。

本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果(57,"#")(33,"include")(52,"<")(33,"iostream") 等。

程序的功能:(1)能识别C语言中所有关键字(共32个)(单词种别分别为1 — 32 ,详情见程序代码相关部分,下同)(2)能识别C语言中自定义的标示符(单词种别为 33)(3)能识别C语言中的常数(单词种别为0)(4)能识别C语言中几乎所有运算符(单词种别分别为41 — 54)(5)能识别C语言中绝大多数界符(单词种别分别为 55 — 66)六、运行结果输入文件infile.txt运行结果(输出文件 outfile.txt)七、设计体会八、附录部分(程序代码)提示:文件的打开和读写函数:FILE *fp,*out; //定义文件指针fp=fopen("infile.txt","r"))如果打开文件"infile.txt"失败,则函数返回NULL,即fp=NULL,第二个参数“r”表示以只读方式打开,如果为”w”,则以可写方式打开调用fgetc(fp)这个函数一次从fp所指向的文件读取一个字符char ch=fgetc(fp);想文件写字符的函数为fprintf(FILE * fp,写进的内容)比如下面的调用fprintf(outfile,"abcd\n")是把字符串“abcd”写到文件outfile的末尾,并且在后面加上了一个换行标志文件读写完成后要用函数fclose(fp)关闭。

源代码#include "stdio.h"#include "string.h"#include "ctype.h"void analzid(FILE *output,char *p){int i=0;int count=0;if (isalpha(p[0])){if (strcmp(p,"if")==0) {fprintf(output,"(3,if)\n");}else if(strcmp(p,"then")==0) {fprintf(output,"(4,then)\n");}else if(strcmp(p,"else")==0) {fprintf(output,"(5,else)\n");}else if(strcmp(p,"while")==0) {fprintf(output,"(6,while)\n");}else if(strcmp(p,"do")==0) {fprintf(output,"(7,do)\n");}else if(strcmp(p,"begin")==0) {fprintf(output,"(8,begin)\n");}else if(strcmp(p,"end")==0) {fprintf(output,"(9,end)\n");}else if(strcmp(p,"long")==0) {fprintf(output,"(10,long)\n");}else if(strcmp(p,"switch")==0) {fprintf(output,"(11,switch)\n");} else if(strcmp(p,"case")==0) {fprintf(output,"(12,case)\n");}else if(strcmp(p,"enum")==0) {fprintf(output,"(13,enum)\n");}else if(strcmp(p,"register")==0) {fprintf(output,"(14,register)\n");} else if(strcmp(p,"typedef")==0) {fprintf(output,"(15,typedef)\n");} else if(strcmp(p,"char")==0) {fprintf(output,"(16,char)\n");}else if(strcmp(p,"extern")==0) {fprintf(output,"(17,extern)\n");}else if(strcmp(p,"return")==0) {fprintf(output,"(18,return)\n");}else if(strcmp(p,"union")==0) {fprintf(output,"(19,union)\n");}else if(strcmp(p,"const")==0) {fprintf(output,"(20,const)\n");}else if(strcmp(p,"float")==0) {fprintf(output,"(21,float)\n");}else if(strcmp(p,"short")==0) {fprintf(output,"(22,short)\n");}else if(strcmp(p,"unsigned")==0) {fprintf(output,"(23,unsigned)\n");} else if(strcmp(p,"continue")==0) {fprintf(output,"(24,continue)\n");} else if(strcmp(p,"for")==0) {fprintf(output,"(25,for)\n");}else if(strcmp(p,"signed")==0) {fprintf(output,"(26,signed)\n");} else if(strcmp(p,"void")==0) {fprintf(output,"(27,void)\n");}else if(strcmp(p,"default")==0) {fprintf(output,"(28,default)\n");} else if(strcmp(p,"goto")==0) {fprintf(output,"(29,goto)\n");}else if(strcmp(p,"sizeof")==0) {fprintf(output,"(30,sizeof)\n");} else if(strcmp(p,"volatile")==0) {fprintf(output,"(43,volatile)\n");} else if(strcmp(p,"auto")==0) {fprintf(output,"(44,auto)\n");}else if(strcmp(p,"double")==0) {fprintf(output,"(45,double)\n");} else if(strcmp(p,"int")==0) {fprintf(output,"(46,int)\n");}else if(strcmp(p,"struct")==0) {fprintf(output,"(47,struct)\n");} else if(strcmp(p,"break")==0) {fprintf(output,"(48,break)\n");}else if(strcmp(p,"static")==0) {fprintf(output,"(49,static)\n");} else {fprintf(output,"(1,%s)\n",p);}}else{for(;i<(int)strlen(p);i++) if(isdigit(p[i])) count++;if (count==(int)strlen(p)){fprintf(output,"(2,%s)\n",p);}elseif (p[0]=='_'&&(isalpha(p[1]))){fprintf(output,"(1,%s)\n",p);}else {fprintf(output,"%s 未定义\n",p);}}}void analzsy(FILE *outfile,char *p){if (strcmp(p,"=")==0) {fprintf(outfile,"(37,=)\n");}else if(strcmp(p,"+")==0) {fprintf(outfile,"(31,+)\n");}else if(strcmp(p,"-")==0) {fprintf(outfile,"(32,-)\n");}else if(strcmp(p,"*")==0) {fprintf(outfile,"(33,*)\n");}else if(strcmp(p,"/")==0) {fprintf(outfile,"(34,/)\n");}else if(strcmp(p,"(")==0) {fprintf(outfile,"(52,()\n");}else if(strcmp(p,")")==0) {fprintf(outfile,"(53,))\n");}else if(strcmp(p,"[")==0) {fprintf(outfile,"(55,[)\n");}else if(strcmp(p,"]")==0) {fprintf(outfile,"(56,])\n");}else if(strcmp(p,"{")==0) {fprintf(outfile,"(57,{)\n");}else if(strcmp(p,"}")==0) {fprintf(outfile,"(58,})\n");}else if(strcmp(p,"<<")==0) {fprintf(outfile,"(59,<<)\n");}else if(strcmp(p,">>")==0) {fprintf(outfile,"(60,>>)\n");}else if(strcmp(p,"'")==0) {fprintf(outfile,"(61,')\n");}else if(strcmp(p,"#")==0) {fprintf(outfile,"(62,#)\n");}else if(strcmp(p,".")==0) {fprintf(outfile,"(64,.)\n");}else if(strcmp(p,"*")==0) {fprintf(outfile,"(33,*)\n");}else if(strcmp(p,"/")==0) {fprintf(outfile,"(34,/)\n");}else if(strcmp(p,"%")==0) {fprintf(outfile,"(40,%)\n");}else if(strcmp(p,",")==0) {fprintf(outfile,"(64,,)\n");}else if(strcmp(p,":")==0) {fprintf(outfile,"(65,:)\n");}else if(strcmp(p,";")==0) {fprintf(outfile,"(54,;)\n");}else if(strcmp(p,">")==0) {fprintf(outfile,"(36,>)\n");}else if(strcmp(p,"<")==0) {fprintf(outfile,"(35,<)\n");}else if(strcmp(p,">=")==0) {fprintf(outfile,"(39,>=)\n");}else if(strcmp(p,"<=")==0) {fprintf(outfile,"(38,<=)\n");}else if(strcmp(p,"==")==0) {fprintf(outfile,"(41,==)\n");}else if(strcmp(p,"!=")==0) {fprintf(outfile,"(42,!=)\n");}else if(strcmp(p," ")==0) ;else if(strcmp(p,"\n")==0) ;else {fprintf(outfile,"%s 未定义\n",p);}}void main(){FILE *fp,*out;int i=0,x=0,y=0;int EA=0;char ch,str[10000],idstr[10],systr[2];if((fp=fopen("infile.txt","r"))==NULL){printf("Can not open infile!\n");exit(0);}if((out=fopen("outfile.txt","w"))==NULL){printf("Can not open outfile!\n");exit(0);}ch=fgetc(fp);while(ch!=EOF){str[i]=ch;str[i+1]='\0';i++;ch=fgetc(fp);}i=0;while(1){if(str[i]=='@') break;elseif((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')|| (str[i]>='0'&&str[i]<='9')||(str[i]=='_')){idstr[x]=str[i];idstr[x+1]='\0';x++;i++;EA=1;}else{x=0;if((strlen(idstr)!=0)&&(EA)) analzid(out,idstr);idstr[x]='\0';if(str[i]<'0'||(str[i]>'9'&&str[i]<'A')||(str[i]>'Z'&&str[i]<'a')||str[i]>'z'){if(str[i]!='!'&&str[i]!='='&&str[i]!='<'&&str[i]!='>') {systr[y]=str[i];systr[y+1]='\0';analzsy(out,systr);i++; }elseif((str[i]=='!'&&str[i+1]=='=')||(str[i]=='='&&str[i+1]=='=')||(str[i]=='>'&&str[i+1]=='=')||(str[i]=='<'&&str[i+1]=='=')||(str[i]=='<'&&str[i+1]=='<')||(str[i]=='>'&&str[i+1]=='>')){systr[y]=str[i];systr[y+1]=str[i+1];systr[y+2]='\0'; analzsy(out,systr);i++;i++;}else{systr[y]=str[i];systr[y+1]='\0';analzsy(out,systr);i++;}}}}printf("-----全部结果已经存入outfile.txt文档-----\n");fprintf(out,"--------完成--------");fclose(fp);fclose(out);}。

相关主题