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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理实验.docx

1、编译原理实验实验1:源程序预处理一、 实验目的:对源程序进行预处理(函数实现,该函数以后还要用到;输入是源程序,输出是预处理过的程序)二、 实验内容:对源程序进行预处理,去掉空格,跳格,回车,换行,注释等;三、 实验要求:从文本文件中读入源代码文本字符串,预处理结束后写入另外一个文本文件中;实验2:构造词法分析器-自然分词一、 实验目的:从源程序中分离出单词并归类(自然分词构造词法分析程序)二、 实验内容:设计一个词法分析器,用 C 语言或者其他的高级语言实现;从预处理过的源代码文本文件(实验一的输出文件)中读取源代码字符串,词法分析输出的二元式写入另外一个文本文件中;三、 实验要求:1、需要

2、识别出的关键字序号关键字单词种别码属性值备注序号关键字单词种别码属性值备注1Auto17Int2Break18long3Char19return4Case20register5Const21short6continue22signed7Default23sizeof8Do24static9Double25struct10Else26switch11Enum27typedef12Extern28union13Float29unsigned14For30void15Goto31volatile16If32while2、需要识别出的运算符序号运算符运算符种别码运算符属性备注序号运算符运算符种别码运算

3、符属性备注1, 202(21423=524=6-25!=7.26&8!27|9+28=10-29+=11&30-=1231*=13*32/=14/33;15%3416+3517-36183、需要识别出常数常数类型(无符号)常数种别码常数属性备注整型常数(10进制)实型常数(10进制)4、根据文法绘制状态转化图(本图为示例图,实际的状态转化图要自己绘制完成)自定义函数或者使用到变量的意义 char buffer 字符数组,存放源代码的文本; char CHAR 字符变量,存放最新读进的源程序字符; char TOKEN 字符数组,存放构成单词的字符串; char GETCHAR(char buf

4、fer,int* searchIndex) 将下一输入字符读入CHAR,搜索指示器searchIndex前移一个字符; void GETBC(char buffer) 检查CHAR中的字符是否为空白。若是则调用GETCHAR直至CHAR中进入一个非空白字符。 void CONCAT(char TOKEN,char CHAR ) 把CHAR中的字符连接到TOKEN之后。 int LETTER(char CHAR) 判断CHAR中的字符是不是字母,从而给出真假值TRUE、FALSE。 int DIGIT(char CHAR) 判断CHAR中的字符是不是数字,从而给出真假值TRUE、FALSE。 v

5、oid RESERVE(char RESERVE_TABLE,char TOKEN) 在保留字表RESERVE_TABLE中查找TOKEN void RETRACT(char buffer,int* searchIndex) 把搜索指示器回调一个字节,把CHAR中的字符置为空白。5、把状态转换图转化成程序,每个状态要建立一段程序,做的工作如下:第一步:从输入缓冲区中取一个字符。使用函数GETCHAR,每次调用,推进先行指针,送回一个字符。第二步:确定在本状态下,哪一条箭弧是用刚刚来的输入字符标识的。如果找到,控制就转到该弧所指向的状态;若找不到,那么寻找该单词的企图就失败了。失败:先行指针必须

6、重新回到开始指针处,并用另一状态图来搜索另一单词。如果所有的状态转换图都试过之后,还没有匹配的,就表明这是一个词法错误,此时,调用错误校正程序。典型状态转换图处理流程如下如上的状态转换图,处理代码如下所示: switch(state) case i: CHAR = GETCHAR(buffer ,searchIndex); if(LETTER( CHAR ) = TRUE ) CONCAT(TOKEN,CHAR); state = j ; else if( DIGIT(CHAR) = TRUE ) CONCAT(TOKEN,CHAR); state = k ; else if (CHAR=/)

7、 CONCAT(TOKEN,CHAR); state = l; else FAIL(); break; 如上的状态转换图,处理代码如下所示: switch(state) case 0: CHAR = GETCHAR(buffer,searchIndex) ; if ( LETTER(CHAR)=TRUE ) CONCAT(TOKEN,CHAR); state = 1 ; else FAIL(); break; case 1: CHAR = GETCHAR(buffer,searchIndex); if ( LETTER(CHAR)=TRUE | DIGIT(CHAR) =TRUE ) CONC

8、AT(TOKEN,CHAR); state = 1 ; else state = 2 ; break; case 2: /构造TOKEN对应的二元式 RETRACT( buffer, searchIndex) ; /返回多读去的一个字符 return TOKEN对应的二元式 ; 如上的状态转换图,处理代码如下所示: switch (state) case 3 : CHAR = GETCHAR(buffer,searchIndex); if ( DIGIT(CHAR)=TRUE ) CONCAT(TOKEN,CHAR); state = 3 ; else state = 4 ; break; c

9、ase 4: /构造TOKEN对应的二元式 RETRACT( buffer, searchIndex) ; /返回多读去的一个字符 return TOKEN对应的二元式 ; 实验3:构造词法分析器-DFA一、 实验目的:使用DFA实现词法分析(函数实现,该函数以后还要用到,输入预处理过的源程序,输出是分离出的单词符号和种别码的列表)二、 实验内容:基于DFA设计一个词法分析器。从预处理过的源代码文本文件(实验一的输出文件)中读取源代码字符串,词法分析输出的二元式写入另外一个文本文件中;三、 实验要求:1、需要识别出的关键字序号关键字单词种别码属性值备注序号关键字单词种别码属性值备注1Auto1

10、7Int2Break18long3Char19return4Case20register5Const21short6Continue22signed7Default23sizeof8Do24static9Double25struct10Else26switch11Enum27typedef12Extern28union13Float29unsigned14For30void15Goto31volatile16If32while2、需要识别出的运算符序号运算符运算符种别码运算符属性备注序号运算符运算符种别码运算符属性备注1, 202(21423=524=6-25!=7.26&8!27|9+28=

11、10-29+=11&30-=1231*=13*32/=14/33;15%3416+3517-36183、需要识别出常数常数类型(无符号)常数种别码常数属性备注整型常数(10进制)实型常数(10进制)4、根据词法绘制状态转换图(下图为示例图,实际的状态转化图要自己绘制完成)5、根据状态转化图生成转换表(DFA)(下表为示例表格,实际的状态转化表要根据自己绘制完成状态转换图转换)字母 数字 * , ; ( ) # 空格 0 1 2 3 4 5 6 7 8 9 10 01 1 1 2 2 3 4 11 5 6 7 8 9 10 11 5、算法流程初始化源程序文件; 标识符字串设置为空; 当前状态设置

12、为初态; 从源程序文件中读取字符设置为当前字符; do while( DFA当前状态当前字符 存在后继状态 ) 将当前字符拼接进标识符字串中; 后继状态=DFA当前状态当前字符; 当前字符指向源程序中后继字符; 当前状态设置为后继状态; 判断标识符字串的类别 ( 自定义标识符、关键字(保留字)、常数、运算符); 构造标识符字串所对应的二元式; 将二元式写入二元式文件; 当前状态设置为初态; 标识符字串设置为空; 从源程序文件中读取下一个字符设置为当前字符;while(源程序未结束);实验4:人狼羊菜过河一、 实验目的:输出人狼羊菜过河的方法二、 实验内容:组合出所有可能状态去除禁忌状态构造图(

13、邻接矩阵或者邻接表)查找路径(深度优先、广度优先)三、 实验要求:实验5:词法分析-LEX一、 实验目的:使用LEX分析工具将LEX源程序编译为词法分析器二、 实验内容:Lex工具是 词法分析程序 的生成器,它根据词法构成规则(正则表达式)生成单词识别程序,由该程序识别出输入源程序(程序设计者根据词法构成规则编写的源程序)中的各个单词。 1、lex程序的结构共有三部分:定义部分、规则部分、-用户子程序部分。其中规则部分是必须的,定义和用户子程序部分是任选的。 (1) 定义部分 定义部分起始于%符号,终止于%符号,其间可以是包括include语句、声明语句在内的C语句。 % #include s

14、tdio.h #include y.tab.h extern int lineno; % (2) 规则部分 规则部分起始于%符号,终止于%符号,其间则是词法规则。词法规则由模式和动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由C语言语句组成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单词存放在yytext字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。 % /t ; 0-9+/.?|0-9*/.0-9+ sscanf(yytext,%1f, &yylval.val); return NUMBER; /n lineno+;return /

15、n; . return yytex+0; % (3) 用户子程序部分 用户子程序部分可以包含用C语言编写的子程序。这些子程序可以用在前面的动作中,可以达到简化编程的目的。下面是带有用户子程序的lex程序片段。 /* skipcmnts(); /* rest of rules */ % skipcmnts() for ( ; ; ) while (input()!=*); if(input()!=/) unput(yytextyylen-1); else return; 2、lex工具的使用方法 首先编写一个lex程序 vi lex.l % #include stdio.h % % /n ; 0

16、-9+ printf(Interger: %s /n,yytext); 0-9*/.0-9+ printf(Float: %s/n,yytext); a-zA-Za-zA-Z0-9* printf(Word:%s/n,yytext); . printf(Other symbol:%c/n,yytext0); % 然后使用lex将lex.l转换成C语言程序 $lex lex.l 使用上述命令产生的C语言程序为lex.yy.c 然后使用C编译程序将lex.yy.c编译成可执行程序regn $cc -c lex.yy.c $cc lex.yy.o -ll -o regn 下面可以使用regn来识别单

17、词 $vi testfile x=355 y=113 p=x/y # ./regn testfile Word:x Other symbol:= Interger: 355 Word:y Other symbol:= Interger: 113 Word:p Other symbol:= Word:x Other symbol:/ Word:y # 三、 实验要求:实验6:正则式转化为NFA 一、 实验目的:将输入的正则表达式转化为NFA二、 实验内容:编程序实现正则表达式转化为NFA。三、 实验要求: (1)程序接受文本文件中输入的正则表达式,生成该正则表达式对应的NFA,在屏幕上显示出这个

18、NFA。(2)统计并输出该NFA中的节点个数和边的个数;(3)输入的正则表达式中包含的运算符包括:连接运算符”.”,闭包运算符“*”,逻辑或运算符“|”,左括号“(“,右括号“)”。运算符的运算优先级:*.|()#*.|()#(4)输入的正则表达式中的字符限于大写英文字母,小写英文字母,数字09;(5)NFA使用图的邻接链表或者邻接矩阵存储;(6)程序的调试者和执行者保证输入的正则表达式正确,程序不检查正则表达式的正确性。四、结构体和算法流程如果NFA使用图的邻接链表存储,邻接链表中存储边信息的结构体:图的邻接链表中存储图的节点(NFA的状态)信息的结构体:NFA中的状态在图中用图的节点表示,

19、NFA的所有状态保存在邻接链表的节点结点结构体数组中,结构体定义:每个输入符号都要生成一个NFA(就是一对开始结束节点和中间连着的箭弧),输入符号生成的NFA要进栈,输入符号对应的NFA的栈结构体:struct stateStack struct State * pStateListMAX; /栈空间 int top; /栈顶,栈顶元素在数组中的下标;正则表达式的运算符栈算符优先算法初始化状态栈;初始化运算符栈;# 压进入运算符栈;在正则表达式末尾添加 # 运算符;产生一个初始0号节点读取正则表达式的第一个字符;while (正则表达式没有结束) if (当前字符是正则表达式的字符) 产生一对

20、新开始和结束节点; 在开始节点和结束节点之间拉一条标注为当前字符的箭弧; 将开始节点和结束节点压入状态栈; 读取下一个字符; else if (当前操作符运算优先级别 比 栈顶运算符优先级别 高) 当前操作符压入符号栈; 读取下一个字符; else if(当前操作符运算优先级别 比 栈顶运算符优先级别 低) 运算符栈的栈顶运算符出栈; if(出栈运算符是连接符) 从状态栈中弹出一对开始结束节点A; 从状态栈中弹出一对开始结束节点B; 从B的结束节点拉一条指示的箭弧到A的开始节点; B的开始节点和A的结束节点作为一对开始结束节点入状态栈; else if(出栈运算符是逻辑或) 从状态栈中弹出一对开始结束节点A; 从状态栈中弹出一对开始结束节点B; 生成一对新的开始结束节点C; 从C的开始节点拉一条指示的箭弧到A的开始节点; 从C的开始节点拉一条指示的箭弧到B的开始节点; 从A的结束节点拉一条指示的箭弧到C的结束节点; 从B的结束节点拉一条指示的箭弧到C的结束节点; C的开始节点和结束节点作为一对节点入状态栈;

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

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