ImageVerifierCode 换一换
格式:DOC , 页数:23 ,大小:318.04KB ,
资源ID:7512845      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

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

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【仙人****88】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【仙人****88】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(编译原理实验-简单词法分析(含源代码及实验结果).doc)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

编译原理实验-简单词法分析(含源代码及实验结果).doc

1、附录一 实验报告样式编译原理实验报告实验2 简单词法分析姓名 陈婷婷 学号 1009050121 班级 计科1001班时间: 2012/4/5 地点:文波同 组 人:无指导教师:朱少林实验目的 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法;掌握词法分析的实现方法;上机调试编出的词法分析程序。实验内容 掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 掌握词法分析的实现方法。 上机调试编出的词法分析程序。 为简单起见,假设编译语言为具有下特征

2、的C_minus。该词法分析器要求至少能够识别C_minus中的以下几类单词:a 关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写;b 标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*;c 常数:NUM=(+ | - |)digit digit*(.digit digit* |)(e(+ | - |) digit digit* |),letter = a|.|z|A|.|Z|,digit = 0|.|9,包括整数,如123, -123, +123等;小数

3、,如123.45, +123.45, -123.45;科学计数法表示的常数,如+1.23e3,-2.3e-9;d 专用符号:+ - * / = = != = ; , ( ) /* */; 实验环境 软件:VC+6.0 实验前准备1、 方案设计: 准备模拟数据:本实验中使用 “测试文件.c” 程序思想:该实验要识别关键字、标识符、常数、专用符号(分界符、算术运算符和关系运算符)。对于关键字本实验主要识别10个(break、do、else float if int for switch main char) ,使用的数据结构为:struct Key/用于关键字和标识符及常数,由于常数有科学计数法的

4、表示,所以该实验中把常数当做字符串进行检测输出 char name20; int i; int t; ; Key keyword10;/存放10个关键字然后在函数void initial()对Key keyword10进行初始化。函数int search_key(char *teststring, FILE *f)用来将识别到的以字母开头的字符串teststring与定义的关键字一一比较,如果是关键字则把它写入文件f中,否则在检验是否是标识符;如果是关键字则返回1,否则返回0.对与标识符和常数,使用的数据结构是一样的,这是因为识别一个标识符和识别一个常数都是要读入多个字符才能识别一个完整的,而

5、且标识符表和常数表都是在识别过程中建立的,都所以用到的数据结构为:struct Key/用于关键字和标识符及常数 char name20; int i; int t; ; struct key_infor/记录标识符表,常数表的相关信息struct Key *head;int key_length; ;识别到一个以字母开头的符号串后如果不是关键字,就调用void search_table(char *teststring, key_infor *p, FILE *f)与已经识别到的标识符一一比较,如果是新的则赋予新的i值并打印输出到屏幕并且写入f中(只要是标志符就写入文件f中)。Main()中

6、将识别到的标识符(不重复)写入另外的文件中。search_table中关键部分如下:while( jkey_length+; pointj.i=j; pointj.t=6;识别到一个完整的常数则进行与标识符相似的处理,void search_number(char *teststring, key_infor *p, FILE *f)的思想与void search_table(char *teststring, key_infor *p, FILE *f)的基本一致。Main()中将识别到的常数(不重复)写入另外的文件中。如果既不是字母开头也不是数字开头,则调用void search_sign

7、(char x, FILE *file, FILE *f),该函数实现对专用符号的识别,并把识别到的专用符号写入文件f中。该实验有六个输出文件,存放输出结果。其中与标志符相关的有两个,一个存放识别到的所有标识符(有重复,即测试文件中的所有标识符),一个存放不重复的(重复的只存一次),与常数相关的文件类似也2个,另外的的两个分别存放识别到的专用符号和关键字。2、 程序设计#include stdio.h#include stdlib.h#include string.h struct Key/用于关键字和标识符及常数,由于常数有科学计数法的表示,所以该实验中把常数当做字符串进行检测输出 char

8、 name20; int i; int t; ; Key keyword10;/存放10个关键字 struct key_infor/记录标识符表,常数表的相关信息struct Key *head;int key_length; ; struct op/用于除关系运算符以外的专用符号 char mark; int ii; int tt; ; op seperateop8 ; op mathop4; struct reop/用于除关系运算符以外的专用符号 char remark3; int iii; int ttt; ; reop relatop8; char a10=,;,.,=,(,),;/分

9、界符 char b4=+,-,*,/;/算术运算符 char signal84=,=,=,!=; void initial()/初始化关键字表 分界符表 算术运算符表 关系运算符表 for(int j=0; j10;j+)/初始化关键字表keywordj.t=1;keywordj.i=j;strcpy(keyword0.name,break);strcpy(keyword1.name,do);strcpy(keyword2.name,else);strcpy(keyword3.name,float);strcpy(keyword4.name,if);strcpy(keyword5.name,i

10、nt);strcpy(keyword6.name,for);strcpy(keyword7.name,switch);strcpy(keyword8.name,main);strcpy(keyword9.name,char);printf(以下是可以识别的关键字内部表示n);printf(关键字 i值 t值n);for(int k=0;k10;k+)printf(%st,keywordk.name);printf(%dt,keywordk.i);printf(%dn,keywordk.t); for(int m=0;m10;m+)/初始化分界符表 seperateopm.mark=am;sep

11、erateopm.ii=m;seperateopm.tt=2; printf(以下是可以识别的分界符内部表示n);printf(分界符 i值 t值n);for(int n=0;n10;n+)printf(%ct,seperateopn.mark);printf(%dt,seperateopn.ii);printf(%dn,seperateopn.tt); for(int p=0;p4;p+)/初始化算术运算符表 mathopp.mark=bp;mathopp.ii=p+16;/先用十进制表示?mathopp.tt=3; printf(以下是可以识别的算术运算符内部表示n);printf(算术运

12、算符 i值 t值n);for(int q=0;q4;q+)printf(%ctt,mathopq.mark);printf(%dt,mathopq.ii);/查如何用十六进制输出?printf(%dn,mathopq.tt); for(int r=0;r8;r+)/初始化关系运算符表 strcpy(relatopr.remark,signalr);relatopr.iii=r;/这里用十进制表示?relatopr.ttt=4; printf(以下是可以识别的关系运算符内部表示n);printf(关系运算符 i值 t值n);for(int s=0;s8;s+)printf(%stt,relato

13、ps.remark);printf(%dt,relatops.iii);/查如何用十六进制输出?printf(%dn,relatops.ttt); int search_key(char *teststring, FILE *f)/设置返回值用于确定是否需要检验是不是标识符/检测是否为关键字,如果是则写入关键字文件中int j=0; int i=10;while( jkey_length;/i记录标识符表的长度int j=0; Key *point;point=p-head;while( jkey_length+; pointj.i=j; pointj.t=6;printf(%s是标志符,i=

14、%d,t=%dn,pointj.name,pointj.i,pointj.t); fprintf(f,%st%5dt%5dn,pointj.name,pointj.i,pointj.t);/将新的标识符写入标识符文件f中return ;void search_number(char *teststring, key_infor *p, FILE *f)/查填常数表函数,p为指向结构体的指针int i=p-key_length;/i记录常数表的长度int j=0; Key *point;point=p-head;while( jkey_length+; pointj.i=j; pointj.t=

15、5;printf(%s是常数,i=%d,t=%dn,pointj.name,pointj.i,pointj.t); fprintf(f,%st%5dt%5dn,pointj.name,pointj.i,pointj.t);/将新的常数写入文件f中return ; Void search_sign(char x, FILE *file, FILE *f) /检测是否为专用符号int j=0;char temp=x;while( j10 & x!=seperateopj.mark)/检测是否为分界符j+;/与定义的8个分隔符一一比较if(j10)/是分隔符printf(%c是分界符,i=%d,t=

16、%dn,seperateopj.mark,seperateopj.ii,seperateopj.tt); fprintf(f,%ct %dt %dn,seperateopj.mark,seperateopj.ii,seperateopj.tt);/将识别到的分隔符写入文件f中 else /不是分界符,就把j赋值0,与算术运算符比较j=0;while( j4&x!=mathopj.mark) j+;/与定义的4个算术运算符一一比较 if(j:x=fgetc(file);if (x=) printf(%s是关系运算符,i=%d,t=%dn,relatop4.remark,relatop4.iii,

17、relatop4.ttt); fprintf(f,%st %dt %dn,relatop4.remark,relatop4.iii,relatop4.ttt);/将识别到的关系运算符写入文件f中 break;elsefseek(file,-1L,SEEK_CUR);x=temp; printf(%s是关系运算符,i=%d,t=%dn,relatop3.remark,relatop3.iii,relatop3.ttt); fprintf(f,%st %dt %dn,relatop3.remark,relatop3.iii,relatop3.ttt);/将识别到的关系运算符写入文件f中break;

18、 case)printf(%s是关系运算符,i=%d,t=%dn,relatop5.remark,relatop5.iii,relatop5.ttt); fprintf(f,%st %dt %dn,relatop5.remark,relatop5.iii,relatop5.ttt);/将识别到的关系运算符写入文件f中 break; elsefseek(file,-1L,SEEK_CUR); x=temp;printf(%s是关系运算符,i=%d,t=%dn,relatop0.remark,relatop0.iii,relatop0.ttt); fprintf(f,%st %dt %dn,rel

19、atop0.remark,relatop0.iii,relatop0.ttt);/将识别到的关系运算符写入文件f中 break;case=:x=fgetc(file);if(x=)printf(%s是关系运算符,i=%d,t=%dn,relatop6.remark,relatop6.iii,relatop6.ttt); fprintf(f,%st %dt %dn,relatop6.remark,relatop6.iii,relatop6.ttt);/将识别到的关系运算符写入文件f中 break;elsefseek(file,-1L,SEEK_CUR); x=temp;printf(%s是关系运

20、算符,i=%d,t=%dn,relatop2.remark,relatop2.iii,relatop2.ttt); fprintf(f,%st %dt %dn,relatop2.remark,relatop2.iii,relatop2.ttt);/将识别到的关系运算符写入文件f中break;case!:x=fgetc(file); if(x=) printf(%s是关系运算符,i=%d,t=%dn,relatop7.remark,relatop7.iii,relatop7.ttt); fprintf(f,%st %dt %dn,relatop7.remark,relatop7.iii,rela

21、top7.ttt);/将识别到的关系运算符写入文件f中 break; return; void main() char readchar; char teststr20;/存放标识符 char linkstr2=0;/用于把字符readchar连接到teststr initial(); FILE *key_result;/新建并打开关键字结果.txt文件key_result=fopen(关键字结果.txt,w+); fprintf(key_result,关键字t i值 t值n);FILE *table_result;/新建并打开文件table_result=fopen(标识符结果.txt,w+

22、);fprintf(table_result,标识符t i值 t值n);key_infor information;/用于指向符号表Key mark400;/定义符号表最多可以有400个符号information.head=mark;information.key_length=0; key_infor numinformation;/用于指向常数表Key nummark400;/定义符号表最多可以有400个符号numinformation.head=nummark;numinformation.key_length=0;FILE *sign_result;/新建并打开专用符号结果.txt文件

23、sign_result=fopen(专用符号结果.txt,w+); fprintf(sign_result,专用符号ti值tt值n);FILE *number_result;/新建并打开常数结果.txt文件number_result=fopen(常数结果.txt,w+); fprintf(number_result,常数t i值 t值n); FILE *fp; fp=fopen(测试文件.c,r);if (fp=NULL)printf(打开文件失败!);exit(0);/打开测试文件fp readchar=fgetc(fp);while(readchar!=EOF) teststr0=0;if

24、(readchar=a|readchar=A& readchar=Z)/第一个是字母转向关键字与标识符 while(readchar=a|readchar=A& readchar=0& readchar=48&readchar=48&readchar=48&readchar=48&readchar=57) linkstr0=readchar; strcat(teststr,linkstr);/会自动添加0 readchar=fgetc(fp);search_number(teststr, &numinformation,number_result ); else/判断是否为专用运算符 sear

25、ch_sign(readchar, fp, sign_result); readchar=fgetc(fp); fclose(fp);/关闭测试文件 fclose(key_result);/关闭关键字文件fclose(table_result);/关闭标识符文件 fclose(sign_result); FILE *table=fopen(符号表.txt,w+);/新建符号表.txt文件 fprintf(table,标识符t i值 t值n); if(table=NULL) printf(文件打开失败!);exit (0); int i=0; while(iinformation.key_len

26、gth) fprintf(table,%st%5dt%5dn,marki.name,marki.i,marki.t);/把识别到的标识符写入符号表.txt文件 i+; fclose(table); FILE *NUMBER=fopen(常数表.txt,w+);/新建常数表.txt文件 fprintf(NUMBER,常数t i值 t值n); if(NUMBER=NULL) printf(文件打开失败!);exit (0); int p=0; while(pnuminformation.key_length) fprintf(NUMBER,%st%5dt%5dn,nummarkp.name,num

27、markp.i,nummarkp.t);/把识别到的标识符写入符号表.txt文件 p+; fclose(NUMBER); 实验步骤将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见下图。图 词法分析程序流程图标识符的正规式定义和确定的有限自动机见实验一常数的正规式定义:NUM=(+ | - |)digit digit*(.digit digit* |)(e(+ | - |) digit digit* |),letter = a|.|z|A|.|Z|,digit = 0|.|9化简后的确定的有限自动机如下:实验结果及其分析: 关键字结果.txt(用于存放识别到的关键字)内容如下:关键字 i

28、值 t值int 5 1int 5 1int 5 1int 5 1char 9 1int 5 1char 9 1char 9 1main 8 1char 9 1int 5 1char 9 1if 4 1else 2 1int 5 1char 9 1char 9 1int 5 1for 6 1if 4 1 标识符结果.txt(存放识别到的所有标识符) 标识符 i值 t值include 0 6stdio 1 6h 2 6qq 3 6temp 4 6temp 4 6s 5 6search 6 6str 7 6c 8 6void 9 6str 7 6c 8 6m 10 6i 11 6printf 12

29、6please 13 6input 14 6a 15 6string 16 6gets 17 6str 7 6puts 18 6please 13 6input 14 6the 19 6you 20 6search 6 6c 8 6getchar 21 6m 10 6search 6 6str 7 6c 8 6m 10 6printf 12 6can 22 6not 23 6find 24 6printf 12 6the 19 6c 8 6you 20 6search 6 6is 25 6d 26 6n 27 6m 10 6search 6 6str 7 6c 8 6i 11 6i 11 6str 7 6i 11 6i 11 6str 7 6i

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服