ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:17.80KB ,
资源ID:9847358      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9847358.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言词法分析器构造实验报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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