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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

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

1、电子科大编译原理实验报告得分80分电 子 科 技 大 学实 验 报 告学生姓名:爸爸 学 号:* 指导教师:陈昆实验地点:科研楼A-506 实验时间:2017-04-28一、实验项目名称:词法分析器的设计与实现二、实验学时:4学时三、实验原理 1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序或词法分析器,也称扫描器。2.词法分析的功能是:从左到右逐个地扫描源程序字符串,按照词法规则,识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关的错误信息。3.识别出来的单词会采用某种中间表现形式,通常一个单词用

2、一个二元式来表示:(单词类别,单词的属性)。4.状态转换图简称转化图,是有限有向图,是设计词法分析器的有效工具。四、实验目的 通过该实验,让同学们自己独立自主的设计词法分析器,使得同学们可以更好的掌握词法分析程序设计的原理及相应的程序设计方法,对编译这门课程也可以有更加深刻理解,同时还可以锻炼编程能力。五、实验内容 实现求n!的极小语言的词法分析程序,返回二元式作为输出。六、实验器材(设备、元器件)1.操作系统:Windows XP2.开发工具:VS2013七、实验步骤(1)在VS2013中创建工程;(2)编写输入输出,初始化,错误处理等函数;(3)建立相应的单词符号与种别对照表,根据状态转换

3、图编写相应的处理函数;(4)运行代码进行调试;(5)编写测试需要的输入文件:.pas文件;(6)生成.dyd文件。八、实验数据及结果分析编码完成后将测试程序放入debug文件夹中,测试程序如下图: 代码运行成功后在debug文件夹中会产生对应的exe,在cmd中运行后,会在debug文件夹中生成后缀为dyd和err的文件,打开dyd如下图所示:因为没有错误,所以对应的test1.err的文件为空 可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。九、实验结论 词法分析器的功能是:从左到右逐个的扫描源程序的字符串,按照词法规则,识别出单词符号作为输出,对识别过程

4、中发现的词法错误,输出有关的错误信息。十、总结及心得体会 通过本次实验,即对词法分析程序的设计,锻炼了自己的编程能力,同时加深了自己对词法分析器的理解和掌握以及对待编译这门课程的理解,提高了自己的动手能力,在编码的过程中也遇到了许多问题,例如如何解决产生的文件后端对齐等等问题,让我的编码能力在此次实验中得到了一定的提高。十一、对本实验过程及方法、手段的改进建议 要先了解词法分析器的功能以及输入输出形式,熟练的掌握状态转化图。 报告评分:指导教师签字:实验参考源代码如下:#include#include#include#define MAX_COUNT 2048#define ILLEGAL_C

5、HAR_ERR 1#define UNKNOWN_OPERATOR_ERR 2char getnbc() char ch; ch = getchar(); while (1) if (ch = r | ch = t | ch = ) ch = getchar(); else break; return ch;bool letter(char character) if (character = a&character = A&character = 0&character = 0) return true; else return false;bool LexAnalyze() static

6、int lineNum = 1; char character; char token17 = ; character = getnbc(); switch (character) case n: output(EOLN, 24); lineNum+; break; case EOF: output(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

7、p: case q: case r: case s: case t: case u: case 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 (le

8、tter(character) | digit(character) char s2 = character ; strcat(token, s); character = getchar(); retract(character); int num; num = reserve(token); if (num != 0) output(token, num); else int val; val = symbol(); output(token, val); break; case 0: case 1: case 2: case 3: case 4: case 5: case 6: case

9、 7: case 8: case 9: while (digit(character) char s2 = character ; strcat(token, s); character = getchar(); retract(character); int val; val = constant(); output(token, val); break; case =: output(=, 12); break; case ) output(, 13); else if (character = =) output(=, 14); else retract(character); outp

10、ut(: character = getchar(); if (character = =) output(=, 16); else retract(character); output(, 17); break; case -: output(-, 18); break; case *: output(*, 19); break; case : character = getchar(); if (character = =) output(:=, 20); else error(lineNum, 2);/输出“未知运算符”错误 break; case (: output(, 21); br

11、eak; case ): output(), 22); break; case ;: output(;, 23); break; default: error(lineNum, 1); return true;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) cha

12、r* 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 (argc != 2) return false; else char*

13、inFilename = argv1;/argv1; char outFilenameMAX_COUNT = ; char errFilenameMAX_COUNT = ; char filenameMAX_COUNT = ; char pathMAX_COUNT = ; getFilename(inFilename, filename); getPath(inFilename, path); strcat(outFilename, path); strcat(outFilename, filename); strcat(outFilename, .dyd); strcat(errFilena

14、me, path); strcat(errFilename, filename); strcat(errFilename, .err); if (freopen(inFilename, r, stdin) != NULL&freopen(outFilename, w, stdout) != NULL&freopen(errFilename, w, stderr) != NULL) return true; else return false; void main(int argc, char* argv) if (init(argc, argv) while (LexAnalyze() fcl

15、ose(stdin); fclose(stdout); fclose(stderr); return;电 子 科 技 大 学实 验 报 告学生姓名:爸爸 学 号:2222222222222 指导教师:陈昆实验地点:科研楼A-504 实验时间:2017-05-14一、实验项目名称:递归下降分析器的设计与实现二、实验学时:4学时三、实验原理1.语法分析是对源程序经过词法分析后转换成的单词流按方法规则进行判断,对能构成正确句子的单词流,给出相应的语法树;对不能构成正确句子的单词流判断其语法错误并做出相应处理。2在不含左递归的文法G中,如果对每一个非终结符的所有候选式的第一个终结符集合都是两两互不相交

16、的(即无公共左因子),则可能(仅是可能)构造一个不带回溯的自上而下分析程序,这个分析程序由一组递归过程组成,每个过程对应文法的一个非终结符,这样的分析程序称为递归下降分析程序或递归下降分析器,其分析方法称为递归下降分析方法。 3.语法分析方法有自上而下和自下而上的分析方法。四、实验目的 通过本次设计递归下降分析器的设计与实现实验,使同学们掌握自上而下的递归分析法的语法分析原理和程序设计方法,了解掌握递归下降分析方法。五、实验内容根据给定的方法,编写相应的递归下降的语法分析程序,实现对词法分析后的单词序列的语法检查和程序结构的分析,生成相应的变量名表和过程名表,并将编译中语法检查出来的错误写入相

17、应的文件。语法错分类: (1)缺少符号错; (2)符号匹配错 (3)符号无定义或重复定义。六、实验器材(设备、元器件)1.操作系统:Windows XP2.开发工具:VS2013七、实验步骤(1)启动VS2013,创建空白工程项目(2)消除文法中的左递归;(3)实现对方法进行递归向下的分析过程;(4)利用词法分析器生成的二元式文件*.dyd进行语法分析;(5)编译与调试以上程序;(6)查看生成的后缀为var,err,pro的文件并进行截图保存八、实验数据及结果分析 九、实验结论 本次实验实现了语法分析器,实现了语法分析器的功能,更加深刻地理解了递归下降分析法。十、总结及心得体会 通过该实验,对

18、递归下降分析程序的设计有着更好的掌握,同时锻炼了自己运用C语言进行编程的能力,也加深了自己对语法分析程序的原理的理解与掌握。十一、对本实验过程及方法、手段的改进建议先理解递归下降分析法的原理才能写出正确的程序。 报告评分:指导教师签字:本实验参考源代码如下:#include #include #include #define MAX_COUNT 1024#define SIGN_UNDEFINED_ERR 1#define SIGN_REDEFINED_ERR 2#define SIGN_EXECUTE_ERR 3#define NO_SIGN_ERR 4#define SIGN_RESERV

19、E_ERR 5#define NO_PARA_ERR 6typedef enum integer types;typedef struct char vname17; char vproc17; bool vkind; types vtype; int vlev; int vadr; varRecord;typedef struct char pname17; types ptype; int plev; int varNum; int fadr; int ladr; int parameter; bool parameterIsDefined; proRecord;void A();void

20、 B();void C();void C_();void D();void E();void F();void G();void J();void K();void L();void M();void M_();void N();void O();void P();void Q();void R();void R_();void S();void S_();void T();void U();void W();void X();void Y();void Z();bool init(int argc, char* argv);bool final();bool error(int lineNu

21、m, int errNum, const char* sign);void getPath(char* in, char* out);void getFilename(char* in, char* out);bool nextToken();bool nextChar();bool isVarExisted(char* vname, char* vproc, bool vkind);bool isProExisted(char* vname);int getNextToken();char inputMAX_COUNT17; int kindMAX_COUNT;int inputCount;

22、 int pToken; int pChar; varRecord currentVar; proRecord currentPro; int lineNum; varRecord varMAX_COUNT;proRecord proMAX_COUNT;int varCount;int proCount;FILE* inFile;FILE* outFile;FILE* errFile;FILE* varFile;FILE* proFile;int main(int argc, char* argv) if (init(argc, argv) A(); final(); return 0;boo

23、l init(int argc, char* argv) if (argc != 2) return false; else char* inFilename = argv1; char outFilenameMAX_COUNT = ; char errFilenameMAX_COUNT = ; char varFilenameMAX_COUNT = ; char proFilenameMAX_COUNT = ; char filenameMAX_COUNT = ; char pathMAX_COUNT = ; /获得文件名(不包括扩展名)和路径 getFilename(inFilename, filename); getPath(inFilename, path); strcat(outFilename, path); strcat(outFilename, filename); strcat(outFilename, .dys); strcat(errFilename, path); strcat(errFilename, filename); strcat(errFilename, .err); strcat(v

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

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