编译原理 实验一 词法分析程序开发_第1页
编译原理 实验一 词法分析程序开发_第2页
编译原理 实验一 词法分析程序开发_第3页
编译原理 实验一 词法分析程序开发_第4页
编译原理 实验一 词法分析程序开发_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、集美大学计算机工程学院实验报告课程名称:编译原理指导教师:付永钢实验成绩:实验编号: 实验一实验名称:词法分析程序开发班级:计算1214姓名:学号:上机实践日期:2014.11上机实践时间: 4学时一、实验目的1、深入理解有限自动机及其应用;2、掌握词法分析程序的开发。;3、掌握根据语言的词法规则构造识别其单词的有限自动机的方法;4、深入理解词法分析程序自动生成原理。二、实验环境Windows7 x64、VC6.0三、实验原理词法分析是编译过程的第一阶段。它的任务就是对输入的字符串形式的源程序按顺序进行扫描,根据源程序的词法规则识别具有独立意义的单词(符号),并输出与其等价的Token序列。有

2、限自动机是描述程序设计语言单词构成的工具,而状态转换图是有限自动机的比较直观的描述方法。我们使用确定的有限状态自动机,简记为DFA。PL/0的语言的词法分析器将要完成以下工作:(1)跳过分隔符(如空格,回车,制表符);(2)识别诸如begin,end,if,while等保留字;(3)识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为SYM_IDENTIFIER。(4)识别数字序列,当前值赋给全局量NUM,sym则置为SYM_NUMBER;(5)识别:=,=之类的特殊符号,全局量sym则分别被赋值SYM_BECOMES,SYM_LEQ,SYM_GEQ等。相关过程

3、(函数)有getsym(),getch(),其中getch()为获取单个字符的过程,除此之外,它还完成:(1)识别且跳过行结束符;(2)将输入源文件复写到输出文件;(3)产生一份程序列表,输出相应行号或指令计数器的值。下面给出能够识别PL0语言中各类单词的DFA:根据语言的词法规则构造出识别其单词的确定有限自动机DFA, 仅仅是词法分析程序的一个形式模型,距离词法分析程序的真正实现还有一定的距离。状态转换图的程序实现通常是采用直接转向法。直接转向法又称为程序中心法,是把状态转换图看成一个流程图,从状态转换图的初态开始,对它的每一个状态结点都编写一段相应的程序。四、实验步骤1、用自动生成工具LE

4、X生成上述给定DFA所对应的PL0语言的词法分析程序在txt文档中编写lex文件test1.l在命令行下执行命令flex解析test.l文件,自动生成lex.yy.c文件在C环境编译lex.yy.c,生成可执行文件lex.yy.exe对测试用例进行测试2、根据DFA在C环境下构造词法分析器对测试用例进行测试五、实验结果测试程序:procedure divide;var w;beginr := x; q := 0; w := y;end1、自动生成工具LEX测试:2、C环境分析器测试:六、实验小结1、通过本次实验,对有限自动机及其应用有了进一步的了解,对词法分析程序的开发有了一定的认识;2、第一

5、次使用自动生成工具LEX,对LEX语法不熟悉,通过查阅网上资料,词法分析程序自动生成原理有了一定的认识,能够基本完成本实验的需求,同时对本课程的实际意义也有了全面的理解;3、在通过C语言编写词法分析器的过程中,用二维数组构造分析表,但是不断出现栈溢出问题,后将分析表缩小,仅存保留字,对其他符号逐一判断,实现本实验要求词法分析器;4、利用C语言构造词法分析器,考虑到分隔符问题,在本次实验中,仅考虑了n、t、空格、以及;,凡不以这四个字符结束的串都被视为错误。程序代码:1、LEX:digit 0-9letter A-Za-zid (letter|_)(letter|digit|_)*% |t|n+

6、var printf(21,%sn,yytext);if printf(22,%sn,yytext);then printf(23,%sn,yytext);else printf(24,%sn,yytext);while printf(25,%sn,yytext);for printf(26,%sn,yytext);begin printf(27,%sn,yytext);writeln printf(28,%sn,yytext);procedure printf(29,%sn,yytext);end printf(30,%sn,yytext);id printf(1,%sn,yytext);d

7、igit+ printf(2,%sn,yytext);+ printf(3,%sn,yytext);- printf(4,%sn,yytext);* printf(5,%sn,yytext);/ printf(6,%sn,yytext);= printf(7,%sn,yytext); printf(8,%sn,yytext); printf(9,%sn,yytext); printf(10,%sn,yytext);= printf(12,%sn,yytext);( printf(13,%sn,yytext);) printf(14,%sn,yytext); printf(15,%sn,yyte

8、xt); printf(16,%sn,yytext); printf(17,%sn,yytext);, printf(18,%sn,yytext); printf(19,%sn,yytext);:= printf(20,%sn,yytext);%#include int main()yylex ( );return 0 ;yywrap()return 1;2、C程序#include stdio.h#include conio.h#include string.hvoid main()int i=0,j;int k1=0,k2=0; char table1010=var,if,then,else

9、,while,for,begin,writeln,procedure,end; char c;char t20=0;/缓冲,用于存放临时串 freopen(D:学习相关编译原理第一部分实验内容Cin.txt,r,stdin); c=getchar(); while(c!=EOF) if(c= |c=n|c=t) c=getchar(); else if(c=a&c=A&c=a&c=A&c=0&c=9) ti+=c; c=getchar(); if(c= |c=n|c=t|c=;)for(j=0;j10;j+)if(strcmp(t,tablej)=0)printf(%d,%sn,j+21,t)

10、;k1=1;/不是保留字标志break;if(k1=0)printf(1,%sn,t);/标识符if(c=;)printf(17,;n);c=getchar();elseprintf(100,errorn);for(j=0;j=0&c=0&c=9) ti+=c;c = getchar();if(c= |c=n|c=t|c=;)printf(2,%sn,t);if(c=;)printf(17,;n);for(j=0;j)c=getchar();if(c= |c=n|c=t)printf(8,n);else if(c=)c=getchar();if(c= |c=n|c=t)printf(12,=n

11、);elseprintf(100,errorn);else printf(100,errorn);else if(c=)c=getchar();if(c= |c=n|c=t)printf(9,|c=)if(c=)k2=1;c=getchar();if(c= |c=n|c=t)if(k1=0)printf(10,n);elseprintf(11,=n);elseprintf(100,errorn);else printf(100,errorn);else if(c=+)c=getchar();if(c= |c=n|c=t)printf(3,+n);else printf(100,errorn);

12、else if(c=-)c=getchar();if(c= |c=n|c=t)printf(4,-n);else printf(100,errorn);else if(c=*)c=getchar();if(c= |c=n|c=t)printf(5,*n);else printf(100,errorn);else if(c=/)c=getchar();if(c= |c=n|c=t)printf(6,/n);else printf(100,errorn);else if(c=)c=getchar();if(c= |c=n|c=t)printf(7,=n);else printf(100,error

13、n);else if(c=()c=getchar();if(c= |c=n|c=t)printf(13,(n);else printf(100,errorn);else if(c=)c=getchar();if(c= |c=n|c=t)printf(14,)n);else printf(100,errorn);else if(c=)c=getchar();if(c= |c=n|c=t)printf(15,n);else printf(100,errorn);else if(c=)c=getchar();if(c= |c=n|c=t)printf(16,n);else printf(100,errorn);else if(c=;)c=getchar();if(c= |c=n|c=t)printf(17,;n);else printf(100,errorn);else if(c=)c=getchar();if(c= |c=n|c=t)printf(18,n);else printf(100,errorn);else if(c=)c=getchar();if(c= |c=n|

温馨提示

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

评论

0/150

提交评论