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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

电子科大编译原理实验报告得分70分.docx

1、电子科大编译原理实验报告得分70分计算机专业类课程实验报告课程名称:编译原理学院:计算机科学与工程学院专业:计算机科学与技术专业学生姓名:郫县库里学号:2014666666666指导教师:日期: 2017年 5月 14日电 子 科 技 大 学实 验 报 告实验一1、实验名称:词法分析器的设计与实现2、实验学时:43、实验内容和目的:(一)实验内容:1.源语言:求n!的极小语言2.输入输出:源程序*.pas文件作为输入,经过自己编程实现的词法分析器进行处理,生成二元式,保存到*.dyd文件中,如下图所示。(二)实验目的:通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程

2、序设计方法,同时提高编程能力。4、实验原理:(一) 结合“数据结构”进行分析:1. 二元式文件*.dyd(1) 二元式形式:分析:由输出二元式形式可知,使用printf输出可以很方便达到要求:(2) 每行后加一分析:对输入文件中的换行符“n”,要采取相应的策略:(3) 文件结尾加分析:对于文件末尾的“EOF”,要采取相应的策略:2. 错误信息文件:*.err(1) 错误信息格式分析:设置出错处理的函数,并且需要记录错误行号、错误性质:(2) 注意:进入每一阶段, 首先打开 .err, 如果无错误, 则 .err为空。(二) 词法分析的实现方法利用状态转换分析:根据状态转化图,编写读到不同的内容

3、时的状态转化函数,是设计词法分析器的核心。(三) 对“输入输出”文件的分析文件相关操作因为需要读写文件,并生成错误文件,涉及许多文件相关操作,通过相关函数函数实现功能:5、实验器材(设备、元器件)(一) 操作系统:Windows 8 Professional (二) 开发工具:Visual Studio 2015(三) 编程语言:C6、实验步骤:(一) 启动Visual Studio 2015,新建一个项目LxicalAnalyzer(二) 编写LxicalAnalyzer.h文件,声明项目将要用到的自定义函数:(三) 编写LxicalAnalyzer.cpp文件,根据“状态转化图”、“单词符

4、号与种别对照表”实现LxicalAnalyzer.h中声明的函数(详细代码附在实验报告最后);(四) 编写main.cpp文件,完成编码;(五) 根据给出的测试程序,编写输入文件test.pas(六) 运行写好的词法分析器程序,并结合输出文件test.err、test.dyd进行调试;(七) 完成实验。7、实验数据及结果分析:(一) 输入文件test.pas(二) 执行词法分析器程序(三) 检查输出文件test.err因为输入文件中测试程序没有错误,所以文件为空:(四) 检查输出文件test.dyd检查可知,输出文件内容为符合实验要求的二元式: (五) 修改输入文件,在输入文件中添加错误(六)

5、 再次执行词法分析器程序(七) 重新检查输出文件test.err可见,本词法分析器成功实现检查多处词法错误:8、实验结论、心得体会和改进建议:(一) 实验结论通过编码与反复调试,成功完成了词法分析器的设计与实现,能够对给出文法的测试程序进行正确的词法分析,按要求输出二元式的*.dyd文件。同时,也可以检测出所给源程序中的多处词法错误。(二) 心得体会1. 对于这种需要多次重复同一操作的实验,将相应的操作写成函数,可以方便编码,减少错误和代码行数。2. 第一次编码忽略了状态转化之后的回退工作,导致bug的出现,以后需要吸取经验教训。3. 尽量在第一次编写程序时,写出较多的提示信息和注释,便于发现

6、bug后的调试。(三) 改进建议上课使用的教材P134页“第六章 词法分析”中的内容对本实验的完成有很大帮助,认真阅读后思路更加清晰。*为便于老师评阅报告,两次实验代码都添加底纹后放在在文档最后部分*电 子 科 技 大 学实 验 报 告实验二1、实验名称:递归下降分析器的设计与实现2、实验学时:43、实验内容和目的:(一)实验内容:根据给定的方法,编写相应的递归下降的语法分析程序,实现对词法分析后的单词序列的语法检查和程序结构的分析,生成相应的变量名表和过程名表,并将编译中语法检查出来的错误写入相应的文件。语法错分类:(1)缺少符号错;(2)符号匹配错;(3)符号无定义或重复定义。(二)实验目

7、的:通过设计递归下降分析器的设计与实现实验,使同学们掌握自上而下的递归分析法的语法分析原理和程序设计方法。4、实验原理:(一)语法分析的定义和功能语法分析是根据语法规则,将单词符号构成各类语法单位,并进行语法检查。在本实验中,对源程序经过词法分析后转换成的单词流按方法规则进行判断,对能构成正确句子的单词流,给出相应的语法树;对不能构成正确句子的单词流判断其语法错误并做出相应处理。(二)语法分析的方法语法分析方法有自上而下和自下而上的分析方法。(1)自上而下语法分析法:或从开始符号出发,找最左推导;或从根开始,构造推导树。(2)自下而上语法分析法:从输入串开始,归约,直至文法开始符。本实验中,我

8、们采用自上而下的递归下降分析法,在不含左递归的文法G中,如果对每一个非终结符的所有候选式的第一个终结符都是两两不相交的(即无公共左因子),则可能构造出一个不带回溯的自上而下的分析程序,这个分析程序由一组递归过程组成,每个过程对应文法的一个非终结符。这样的分析程序称为递归下降分析程序。(三)数据结构1.*.dys同*.dyd2.变量名表变量名vname: char(16)所属过程vproc:char(16)分类vkind: 0.1(0变量、1形参)变量类型vtype: types变量层次vlev: int变量在变量表中的位置vadr: int(相对第一个变量而言) 3.过程名表过程名pname:

9、 char(16)过程类型ptype: types过程层次plev: int第一个变量在变量表中的位置fadr: int最后一个变量在变量表中的位置ladr: int 4.四元式表 (oprd, op1, op2, result)oprd整数码op1第一操作数op2第二操作数result结果op1、op2、result可用“值/地址”表示 5.目标代码P码 (四)给定文法产生式实验中给定文法如下:begin ; end ;integer abcdefghijklmno pq rstuvwxyz0123456789integer function ();begin ; end;read()wri

10、te():=-*ifthenelse =5、实验器材(设备、元器件)(一) 操作系统:Windows 8 Professional (二) 开发工具:Visual Studio 2015(三) 编程语言:C6、实验步骤:(一) 启动Visual Studio 2015,新建一个项目GrammerAnalyzer;(二) 消除文法中的左递归;(三) 编写GrammerAnalyzer.h文件,定义将要用到的结构,并声明项目将要用到的自定义函数:(四) 编写GrammerAnalyzer.cpp文件,根据“文法产生式”实现LxicalAnalyzer.h中声明的函数和具体的递归下降分析法(详细代码

11、附在实验报告最后);(五) 编写main.cpp文件,完成编码;(五) 将词法分析器的输出文件test.dyd作为实现的语法分析器的输入文件: (六) 运行写好的词法分析器程序,并结合输出文件test.dys、变量名表文件test.var、过程名表文件test.pro、错误文件等进行调试;(七) 完成实验。7、实验数据及结果分析:(一) 输入文件test.dyd,内容为2元式子 (二) 执行词法分析器程序(三) 检查输出文件test.dys,与输入文件相同,正确: (四) 检查变量名表文件test.var,符合要求:(五) 检查过程名表文件test.pro,符合要求:(六) 检查过程名表文件t

12、est.err,基本符合要求:8、实验结论、心得体会和改进建议:(一)实验结论:本实验程序较好地完成了递归下降分析器的设计与实现,能够对所给文法的程序进行语法分析,生成变量名表和过程名表,如果源程序有语法错误则给出出错类型及所在行数。(二)心得体会:1.标识符中不能包含关键字,以免出错;2.要注意文法中公共左因子的消除;3.思路要清晰,加一些提示信息,避免出现逻辑错误;4.由于对Pascal语言语法细节不是特别熟悉,所以对错误的识别不一定准确,还有改正和提高的空间,期末考试过后有时间,可以做进一步的完善。(三)改进建议:可以改成对C语言等我们经常接触到的语言作为本次实验的源语言,实验做起来可能

13、会更有趣。*以下为实验一源代码,共三个文件*(一) LexicalAnalyzer.h#pragma once#ifndef LEXICALANALYZER_H#define LEXICALANALYZER_Hchar getNextC(); /获取下一个字符bool lexAnalyzer(); /用于词法分析的函数bool isLetter(char ch); /判断ch是否为字母bool isDigit(char ch); /判断ch是否为数字void retract(char& ch); /回退字符int reserve(char* token); /返回保留字对应种别int symb

14、ol(); /返回标识符的对应种别int constant(); /返回常数的对应种别void output_token(const char* token, int kindNum); /按要求格式输出单词符号和种别bool printError(int lineNum, int errNum); /按要求打印错误提醒void getPath(char* in, char* out); /获得路径void getFilename(char* in, char*out); /获得文件名bool init(int argc, char* argv); /初始化函数#endif / ! LEXIC

15、ALANALYZER_H(二) LexicalAnalyzer.cpp#include LexicalAnalyzer.h#include #define MAX_COUNT 1024#define ILLEGAL_CHAR_ERROR 1#define UNKNOWN_OPERATOR_ERROR 2FILE *file;bool lexAnalyzer() /用于词法分析的函数 if (feof(file) return false; static int lineNum = 1; char ch; char token17 = ; ch = getNextC(); switch (ch)

16、 case r: case n: /每行后加一EOLN24 output_token(EOLN, 24); lineNum+; break; case EOF: /结尾加 EOF25 output_token(EOF, 25); return false; case a: case b: case c: case d: case e: case f: case g: case h: case i: case j: case k: case l: case m: case n: case o: case p: case q: case r: case s: case t: case u: cas

17、e v: case w: case x: case y: case z: case A: case B: case C: case D: case E: case F: case G: case H: case I: case J: case K: case L: case M: case N: case O: case P: case Q: case R: case S: case T: case U: case V: case W: case X: case Y: case Z: while (isLetter(ch)|isDigit(ch) ) char s2 = ch ; strcat

18、(token, s); ch = getchar(); retract(ch); int num; num = reserve(token); if (num != 0) output_token(token, num); else int val; val = symbol(); /标识符 output_token(token, val); break; case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: while (isDigit(ch) char s2 = ch ; strcat

19、(token, s); ch = getchar(); retract(ch); int val; val = constant(); output_token(token, val); break; case =: output_token(=, 12); break; case ) output_token(, 13); else if (ch = =) output_token(=, 14); else retract(ch); output_token(: ch = getchar(); if (ch = =) output_token(=, 16); else retract(ch)

20、; output_token(, 17); break; case -: output_token(-, 18); break; case *: output_token(*, 19); break; case : ch = getchar(); if (ch = =) output_token(:=, 20); else printError(lineNum, 2); /输出“未知运算符”错误 break; case (: output_token(, 21); break; case ): output_token(), 22); break; case ;: output_token(;

21、, 23); break; default: printError(lineNum, 1); /输出出现字母表以外的非法字符错误 return true;bool isLetter(char ch) /判断ch是否为字母 if (ch = a&ch = A & ch = 0)& (ch = 0) return true; else return false;char getNextC() /获取下一个字符 char ch; ch = getchar(); while (true) if (ch = r | ch = t | ch = ) / ch = getchar(); else break

22、; return ch; void getPath(char* in, char* out) /获得路径 char* name; name = strrchr(in, ); if (name != NULL) strncpy(out, in, strlen(in) - strlen(name) + 1); else strcpy(out, );void getFilename(char* in, char* out) /获得文件名 char* fullName; char* extension; fullName = strrchr(in, ); extension = strrchr(in, .); if (fullName != NULL) strncpy(out, fullName + 1, strlen(fullName) - 1 - strlen(extension); else strncpy(out, in, strlen(in) - strlen(extension);bool init(int argc, char* argv) /初始化函数 if (0) return false;

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

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