C语言词法分析器构造实验报告.doc

上传人:scccc 文档编号:13595647 上传时间:2022-01-19 格式:DOC 页数:13 大小:169.50KB
返回 下载 相关 举报
C语言词法分析器构造实验报告.doc_第1页
第1页 / 共13页
C语言词法分析器构造实验报告.doc_第2页
第2页 / 共13页
C语言词法分析器构造实验报告.doc_第3页
第3页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C语言词法分析器构造实验报告.doc》由会员分享,可在线阅读,更多相关《C语言词法分析器构造实验报告.doc(13页珍藏版)》请在三一文库上搜索。

1、C语言词法分析器构造实验报告冯绍欣02 计算机(2)2002374203题目要求:完成一个C语言的词法分析器的构造。此词法分析器能识别附值语句、循环语句、条件语句、并能处理注释。选择要分析这个词法分析器分析的主要关键字有:main, int, float, char, if, else, for, while, do, switch, case, break; default的1、c文件,首先对其去掉注释和与空格处理,再根据字符的不同类型分析。全局数据结构:字符数组set:存放从文件中读到的所有字符;str:存放经过注释处理和预空格处理的字符;strtoken:存放当前分析的字符;结构体KEY

2、TABLE :存放关键字及其标号;全局字符变量 ch :当前读入字符;全局整型变量 sr, to:数组str, strtoken的指针。以层次图形式描述模块的组成及调用关系3、主要函数的设计要求(功能、参数、返回值):openfile :打开文件;GetChar :将下一个输入字符读到ch中,搜索指示器前移一字符位置;GetBC :检查ch中的字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符;Concat:将ch中的字符连接到 strtoken之后;IsLetter和IsDigit :布尔函数过程,分别判断ch中的字符是否为字母和数字;Reserve:整型函数过程,对st

3、rtoken中的字符串查找关键字表,若是关键字则返回编码,否则返回Retract :将搜索指示器回调一个字符位置,将ch置为空白字符;reflesh :刷新,把strtoken 数组置为空;prearra ngel :将注释部分置为空格;prearra nge2 :预处理空格,去掉多余空格;an alysis: 词法分析;main :主函数。4、状态转换图:203字b45字符a2981 字母或数字字符c字母非字母或数字数字.数字非数字字符a包括:=,& , | , + ,-字符b包括:-, ,| , *字符 c 包括:,:,(,), , , , , ! ,# , % ,”,/ , * , +

4、,-, , ,.三、源代码如下:#i nclude #in clude char set1000,str500,strtoke n20;char sig n5010,co nsta nt5010;char ch;int sr,to,id=0,st=0;typedef struct keytable /* 放置关键字 */char n ame20;int 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,bre

5、ak,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 open file.n);exit(0);elsewhile(!feof(fp) /* 文件不结束,则循环 */a=getc(fp); /*getc 函数带回一个字符,赋给 a*/setn=a;/*文件的每一个字符都放入set数组中*/ n+;fclose(fp);/* 关闭文件

6、 */setn-1=0;printf(nnSource Codenn);puts(set);printf(nn);reflesh() /* 清空 strtoken 数组 */to=0; /* 全局变量 to 是 strtoken 的指示器 */ strcpy(strtoken, );prearrange1() /* 预处理程序 1*/int i,a,b,n=0;doif(setn=/ & setn+1=*)a=n; /* 记录第一个注释符的位置 */while(!(setn=* & setn+1=/)n+;b=n+1; /* 记录第二个注释符的位置 */for(i=a;i=65 & ch=97

7、 & ch=48 & ch=57)return(1);else return(0);1*/int Reserve() /* 对 strtoken 中的字符串查找保留字表,若是则返回它的编码,否则返回int i,k=0;for(i=0;i=20;i+)if(strcmp(strtoken,keywordi.name)=0) k=1;return(keywordi.kind);if(k!=1)return(-1);void Retract() /* 指示器 sr 回调一个字符位置,把 ch 置为空 */sr-;ch= ;int InsertId()int i,k;for(i=0;iid;i+)k=

8、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,strtoken); /* 插入常数 */st+;return(st-1);void analysis()int value;/* 清空 strtoken 数组 */*预处理,使注释内容换成单个空格,放回s

9、et中*/*预处理,使set中连续的空格置换成单个空格,并把set的内容放到str中*/reflesh();prearrange1();prearrange2();sr=0;GetChar();GetBC();/* 读取第一个字符 */while(ch!=0) /* 当不等于结束符,继续执行 */if(IsLetter()while(IsLetter() | IsDigit() /* 若第一个是字符,继续读取,直到出现空格*/Concat();GetChar();Retract();/*指示器sr回调一个字符位置,把 ch置为空*/value=Reserve();/*对strtoken中的字符

10、串查找保留字表,若是则返回它的编码,否则返回一1*/if(value=-1)/*如果返回值是 1 ,那就是变量,把它输出 */InsertId();/* 插入标识符 */ printf(n%s,strtoken);getch();else /* 否则就是关键字,也输出 */printf(n%s,strtoken); getch();reflesh();else if(IsDigit()while(IsDigit() /* 否则,若第一个是数字,继续读取,知道出现空格 */Concat();GetChar();/* 插入常数 */Retract();InsertConst();printf(n%

11、s,strtoken);getch(); reflesh();elseswitch(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= | ch=& | ch=| | ch=+ | ch=-)/* 如果是这些符号,继续读取下一个 */Concat();/* 判断是

12、否为 =,&,|,+,- 的情况 */GetChar();if(ch=strtoken0)Concat();elseRetract();printf(n%s,strtoken);getch(); reflesh(); break;GetChar();GetBC();main()clrscr();openfile();analysis();printf( “analysis is over! ”); 五、测试结果: 1、分析文件 test1.c 中的程序: Input the filename:test.celse if(ch=+ | ch=- | ch= | ch=! | ch=*)Conca

13、t();/* 判断是否为 +=,-=,=,!=,*= 的情况 */GetChar();if(ch=)Concat();elseRetract();printf(n%s,strtoken);getch();reflesh();break;elseprintf(Error!);getch();break;*Original Code* /* HELLO.C - Hello, world */#include stdio.h#include conio.h main()printf(Hello, worldn); getch();*# includeIllistdioI IhIlli# includeIlliconioI IhIllimain()printf(IlliHelloI IJworldError!nIlli)getch()1.1JAnalysis is over!六、实验总结: 这个程序主要参考书上关于词法分析器的设计。在设计过程中仍有遇到很多困难 , 但经请教同学后,好多问题都并不是想 象中的困难。尽管如此,分析考虑还不全面,例如没有创建符号表和常数表。这些情况将在在语法和语义分析时进行完善。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1