1、C语言词法分析器构造实验报告C语言词法分析器构造实验报告02计算机(2)03xx一、题目要求:完成一个C语言的词法分析器的构造。此词法分析器能识别附值语句、循环语句、条件语句、并能处理注释。二、设计方案:这个词法分析器分析的主要关键字有:main, int, float, char, if, else, for, while, do, switch, case, break; default。选择要分析的c文件,首先对其去掉注释和与空格处理,再根据字符的不同类型分析。1、全局数据结构:字符数组set :存放从文件中读到的所有字符;str :存放经过注释处理和预空格处理的字符;strtoken
2、:存放当前分析的字符;结构体KEYTABLE:存放关键字及其标号;全局字符变量ch:当前读入字符;全局整型变量sr, to:数组str, strtoken 的指针。2、以层次图形式描述模块的组成及调用关系Main ( )Analysis ( )Set32()Openfile ( )Reflesh()Concat()GetChar()GetBC()Process()Reserve()GetChar()IsDigit()IsLetter()Retract()3、主要函数的设计要求(功能、参数、返回值):openfile:打开文件;GetChar:将下一个输入字符读到ch中,搜索指示器前移一字符位置
3、;GetBC:检查ch中的字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符;Concat:将ch中的字符连接到strtoken之后;IsLetter 和IsDigit:布尔函数过程,分别判断ch中的字符是否为字母和数字;Reserve:整型函数过程,对strtoken中的字符串查找关键字表,若是关键字则返回编码,否则返回-1;Retract:将搜索指示器回调一个字符位置,将ch置为空白字符;reflesh:刷新,把strtoken数组置为空;prearrange1:将注释部分置为空格;prearrange2:预处理空格,去掉多余空格;analysis:词法分析;main:
4、主函数。4、状态转换图:1字母或数字字母非字母或数字数字20非数字字符a 字符b 4=字符c 字符a包括:= , & , | , + , -字符b包括:- , , | , *字符c包括:, , : , ( , ) , , , , , ! ,# , % ,”, / , * , + , - , , , .三、源代码如下:#include #include char set1000,str500,strtoken20;char sign5010,constant5010;char ch;int sr,to,id=0,st=0;typedef struct keytable /*放置关键字*/char
5、 name20;593字符a 876int kind;KEYTABLE;KEYTABLE keyword=/*设置关键字*/main,0,int,1,float,2,char,3,if,4,else,5,for,6,while,7,do,8,switch,9,case,10,break,11,default,12,;openfile()/*打开文件*/FILE *fp;char a,filename10;int n=0;printf(Input the filename:);gets(filename);if(fp=fopen(filename,r)=NULL)printf(cannot op
6、en file.n);exit(0);else while(!feof(fp)/*文件不结束,则循环*/a=getc(fp);/*getc函数带回一个字符,赋给a*/setn=a;/*文件的每一个字符都放入set数组中*/n+;fclose(fp);/*关闭文件*/setn-1=0;printf(nn-Source Code-nn);puts(set);printf(n-n);reflesh()/*清空strtoken数组*/to=0;/*全局变量to是strtoken的指示器*/strcpy(strtoken, );prearrange1()/*预处理程序1*/int i,a,b,n=0;d
7、o if(setn=/ & setn+1=*)a=n;/*记录第一个注释符的位置*/while(!(setn=* & setn+1=/)n+;b=n+1;/*记录第二个注释符的位置*/for(i=a;i=65 & ch=97 & ch=48 & ch=57)return(1);else return(0);int Reserve()/*对strtoken中的字符串查找保留字表,若是则返回它的编码,否则返回1*/int i,k=0;for(i=0;i=20;i+)if(strcmp(strtoken,keywordi.name)=0) k=1;return(keywordi.kind);if(k
8、!=1)return(-1);void Retract()/*指示器sr回调一个字符位置,把ch置为空*/sr-;ch= ;int InsertId()int i,k;for(i=0;iid;i+)k=strcmp(strtoken,signi);if(k=0)return(i);strcpy(signid,strtoken);/*插入标识符*/id+;return(id-1);int InsertConst()int i,k;for(i=0;ist;i+)k=strcmp(strtoken,constanti);if(k=0)return(i);strcpy(constantst,strto
9、ken);/*插入常数*/st+;return(st-1);void analysis()int value;reflesh();/*清空strtoken数组*/prearrange1();/*预处理,使注释内容换成单个空格,放回set中*/prearrange2();/*预处理,使set中连续的空格置换成单个空格,并把set的内容放到str中*/sr=0;GetChar();GetBC();/*读取第一个字符*/while(ch!=0)/*当不等于结束符,继续执行*/if(IsLetter()while(IsLetter() | IsDigit()/*若第一个是字符,继续读取,直到出现空格*
10、/Concat();GetChar();Retract();/*指示器sr回调一个字符位置,把ch置为空*/value=Reserve();/*对strtoken中的字符串查找保留字表,若是则返回它的编码,否则返回1*/if(value=-1)/*如果返回值是1,那就是变量,把它输出*/InsertId();/*插入标识符*/printf(n%s,strtoken);getch();else /*否则就是关键字,也输出*/printf(n%s,strtoken);getch();reflesh();else if(IsDigit()while(IsDigit()/*否则,若第一个是数字,继续读
11、取,知道出现空格*/Concat();GetChar();Retract();InsertConst();/*插入常数*/printf(n%s,strtoken);getch();reflesh();else switch(ch)/*否则,若是下面的符号,就直接把它输出*/case ,:case ;:case (:case ):case :case :case :case :case !:case #:case %:case :case /:case *:Concat();printf(n%s,strtoken);getch();reflesh();break;default:if(ch= |
12、 ch=& | ch=| | ch=+ | ch=-)Concat();GetChar();if(ch=strtoken0)Concat();else Retract();printf(n%s,strtoken);getch();reflesh();break;/*如果是这些符号,继续读取下一个*/*判断是否为=,&,|,+,-的情况*/else if(ch=+ | ch=- | ch= | ch=! | ch=*)Concat();/*判断是否为+=,-=,=,!=,*=的情况*/GetChar();if(ch=)Concat();else GetChar();GetBC();main()c
13、lrscr();openfile();analysis();printf(“analysis is over!”);五、测试结果:1、分析文件test1.c中的程序:Input the filename:test.c Retract();printf(n%s,strtoken);getch();reflesh();break;else printf(Error!);getch();break;*Original Code*/* HELLO.C - Hello, world */#include stdio.h#include conio.hmain()printf(Hello, worldn);getch();*#include stdio .h #include conio .h main ()printf (Hello ,worldError!n );getch ();Analysis is over!六、实验总结:这个程序主要参考书上关于词法分析器的设计。在设计过程中仍有遇到很多困难,但经请教同学后,好多问题都并不是想象中的困难。尽管如此,分析考虑还不全面,例如没有创建符号表和常数表。这些情况将在在语法和语义分析时进行完善。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1