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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理比较复杂的词法分析器 含代码Word格式文档下载.docx

1、# 注:#为结束标志符,详见程序框架(3)标识符正规式:ID=letter(letter|digit)*(4)整型常数NUM= digit(digit)*3)词法分析器构造原理: 词法分析器就是根据语言的此法规则构造出识别其单词的有限自动机,它是一个数学模型,先给出识别各类单词的状态转换图,再将各类单词的状态转换图的初始状态合并成一个唯一的初状态;然后化简并调整冲突的状态编号;最后再将有限自动机变成一个可行的词法分析器。二、种别码表设计及其在计算机中存放表示 1)单词种别码设计:单 词 种 别 码 对 照 表单词符号种别码main116if217else318while419do520for6

2、 =21int722char823void924标识符1025整型常数11261227132814* 152)输出形式设计:词法分析器的输入是源程序字符串,输出是对应的单词串。每个单词按照二元组(种别码,单词符号本身)格式输出。例如:假设源程序为main( ) x=9;y=4; if (x0) x=2*x+1/3;#则词法分析器对应输出的结果是:(1,main) (27,( ) (28,) ) (12, ) (10,x) (18,=) (11,9) (26,;) (10,y) (18,=)(11,4) (26,;) (2,if) (27,( ) (10,x) (23,) (11,0) (10,

3、x) (18,=) (11,2) (15,*) (10,x) (13,) (11,1) (16,) (11,3) (26,;) (19,) (0,#)三、词法分析程序详细设计1)算法构造思想:依据建立的识别单词的DFA,设计算法,其框架如下。其中,1 syn存放单词的种别码;2 token存放符合C语言子语言词法规则的单词;3 sum存放整型常量的单词。4 Prog存放所有输入的字符。5 isSignal判断是否带正负号(0不带,1负号,2正号)。6 isDecimal判断是否是小数。7 isExp判断是否是指数。2)主要模块算法的框图描述:四、主要代码#includestring.hmath

4、.hchar prog80; /存放所有输入字符 char token32; / token存放符合C语言子语言词法规则的单词;char ch; /单个字符 int syn,p,m,n; / syn存放单词的种别码 double sum; / sum存放整型常量的单词。int count;int isSignal; /是否带正负号(0不带,1负号,2正号) int isDecimal; /是否是小数 double decimal; /小数 int isExp; /是否是指数 int index; /指数幂 int isNegative; /是否带负号 double temp;int temp2

5、;int repeat;void scanner();char *rwtab9=main, ifelsewhiledofor , intcharvoid;void main() p=0; count=0; isDecimal=0; index=0; repeat=0; printf(nplease input a range of data, with the end of #:n); do ch=getchar(); progp+=ch; while(ch!=# /输入以号键结束 scanner(); /扫描,单词 switch(syn) case 11: if(isDecimal=0) /

6、加了1个强制类型转换 (%d,%d) ,syn,(int)sum); break; else if(isExp=1) (%d,%e) ,syn,sum); isExp=0; else if(isDecimal=1) (%d,%f) case -1: printf(输入错误: n default:(%d,%s) ,syn,token); while(syn!=0); getchar(); void scanner() sum=0; decimal=0; m=0; for(n=0;na)&(chAZ) /ch是字母字符 while(ch09) tokenm+=ch; /ch=token /读下一个

7、字符 tokenm+=0 p-; /回退一格 syn=10; /如果是标识符中的一个 9; if(strcmp(token,rwtabn)=0) syn=n+1; else if(ch) IsNum: if(isSignal=1) /tokenm+=- while(ch sum=sum*10+ch- /ch中数字本身是当做字符存放的 if(ch=.) isDecimal=1; /之前忘了清零,123.123+123.123#两个浮点数就无法识别 /pow(x,y)计算x的y次幂 temp=(ch-)*pow(0.1,+count); decimal=decimal+temp; /AddToDe

8、c(); sum=sum+decimal;e|ch=E isExp=1; isNegative=1; /指数 index=index*10+ch- /10的幂 /123e3代表123*10(3) /sum=sum*pow(10,index);是错误的 if(isNegative) sum=sum*pow(0.1,index); else sum=sum*pow(10,index); sum=-sum; isSignal=0; syn=11; else switch(ch) case : syn=22; syn=20; syn=24; syn=23; syn=17; tokenm+=ch;+ t

9、emp2=progp; if(temp2(temp2(repeat=1) isSignal=2; /isSignal正数 goto IsNum; if(temp2=)|(temp2=)&(repeat=0) /如果重复出现符号,才将后边的+,-视为正负号 repeat=1; /ch=progp+; syn=13; isSignal=1; /读“-”下一个字符 /转到数字的识别 /预言会重复 syn=14;* syn=15;/ syn=16; syn=18; syn=26;( syn=27; syn=12; case syn=19;) syn=28; case syn=0; syn=-1;五、测试结果1)字符串输入测试:2)小数输入测试:六、设计体会与收获通过此次试验,使我对词法分析器有了更加深入的了解,也使我对编译原理这门课程产生了浓厚的兴趣,虽然在实验过程中遇到了不少的困难,但是在同学以及老师共同的帮助下,都基本一一解决,使我懂得了团队精神的重要性。同时通过本次的实验,使我重新学习了C语言编程方法,知识也得到了相应的扩展,思考问题的方式也能够变得多样化和灵活化。总的来说,本学期编译原理课程的实验让我受益匪浅。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1