编译原理比较复杂的词法分析器含代码_第1页
编译原理比较复杂的词法分析器含代码_第2页
编译原理比较复杂的词法分析器含代码_第3页
编译原理比较复杂的词法分析器含代码_第4页
编译原理比较复杂的词法分析器含代码_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验报告二词法分析一、总体设计思想1)实验目的:设计编制并调试一个词法分析程序,加深对构造词法分析器的原 理和技术的理解与应用。2)实验具体要求:针对计算机高级程序语言一一 C语言子语言,运用恰当的词法分析技术线 路,设计和实现c语言子语言的词法分析器。? 编程语言:C语言/JAVA语言?平台选择:Linux/Windows? 技术线路(任选其一)正规式一 NFADFAmin DFAf程序设计正规文法一 NFA。DFA。min DFA一程序设计? 词法分析器程序输出形式,参见,输出形式设计,? 具有出错处理功能C语言子语言词法描述一一涉及的单词类如下:(1)关键字main if else wh

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

3、符号种别码单词符号种别码main1/16if2:17else3=18while419do523void9=24标识符10=25整型常数11;2612(27十13)28一14#0*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,( )(1

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

5、de#include#includechar 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;in

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

7、了 1 个强制类型转换printf(%d,%d) ,syn,(int)sum);break;else if(isExp=1)printf(%d,%e) ,syn,sum);isExp=0;isDecimal=0;break;else if(isDecimal=1)printf(%d,%f) ,syn,sum);isDecimal=0;break;case -1:printf( 输入错误: )printf( n );break;default:printf(%d,%s) ,syn,token);while(syn!=0);getchar();void scanner()sum=0;decimal

8、=0;m=0;for(n=0;n=a)&(ch=A)&(ch=a)&(ch=A)&(ch=0)&(chtokench=progp+; 读下一个字符tokenm+=0;p-; /回退一格syn=10;如果是main, if, else, while, do, for , int , char , void 标识符中的一个for(n=0;n=0)&(ch=0)&(ch=0)&(ch=0)&(ch=9)/指数index=index*10+ch-0;ch=progp+;/10 的幂/123e3 代表 123*10(3)sum=sum*pow(10,index);是错误的if(isNegative)su

9、m=sum*pow(0.1,index);elsesum=sum*pow(10,index);if(isSignal=1)sum=-sum;isSignal=0;p-;syn=11;else switch(ch)case =0)&(temp2=0)&(temp2=9)&(repeat=1)isSignal=1;ch=progp+; / 读“ -”下一个字符 repeat=0;goto IsNum; /转到数字的识别if(temp2=+)|(temp2=-)&(repeat=0)/如果重复出现符号,才将后边的 +, -视为正负号repeat=1; /预言会重复/ch=progp+;/读下一个字符

10、syn=14;break;case1*1.temp2=progp;tokenm+=ch;syn=15;break;case /:syn=16;tokenm+=ch;break;case =:syn=18;tokenm+=ch;break;case ;:syn=26;tokenm+=ch;break;case (:temp2=progp;tokenm+=ch;syn=27;break;case :temp2=progp;tokenm+=ch;syn=12;break;case :temp2=progp;tokenm+=ch;syn=19;break;case ):syn=28;tokenm+=ch;break;case#:syn=0;tokenm+=ch;break;default:syn=-1;五、测试结果1)字符串输入测试:2)小数输入测试:please input a raoge of dati, with the end of t: L2tt11.200300dty key Lu cvnt ituc六、设计体会与收获通过此次试验, 使我对词法分析器有了更加深入的了解

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论