当前位置:文档之家› 电子科大-编译原理实验报告(得分80分)

电子科大-编译原理实验报告(得分80分)

电子科技大学实验报告学生姓名:爸爸学号:2222222222222 指导教师:陈昆实验地点:科研楼A-506 实验时间:2017-04-28一、实验项目名称:词法分析器的设计与实现二、实验学时:4学时三、实验原理1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。

词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序或词法分析器,也称扫描器。

2.词法分析的功能是:从左到右逐个地扫描源程序字符串,按照词法规则,识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关的错误信息。

3.识别出来的单词会采用某种中间表现形式,通常一个单词用一个二元式来表示:(单词类别,单词的属性)。

4.状态转换图简称转化图,是有限有向图,是设计词法分析器的有效工具。

四、实验目的通过该实验,让同学们自己独立自主的设计词法分析器,使得同学们可以更好的掌握词法分析程序设计的原理及相应的程序设计方法,对编译这门课程也可以有更加深刻理解,同时还可以锻炼编程能力。

五、实验内容实现求n!的极小语言的词法分析程序,返回二元式作为输出。

六、实验器材(设备、元器件)1.操作系统:Windows XP2.开发工具:VS2013七、实验步骤(1)在VS2013中创建工程;(2)编写输入输出,初始化,错误处理等函数;(3)建立相应的单词符号与种别对照表,根据状态转换图编写相应的处理函数;(4)运行代码进行调试;(5)编写测试需要的输入文件:.pas文件;(6)生成.dyd文件。

八、实验数据及结果分析编码完成后将测试程序放入debug文件夹中,测试程序如下图:代码运行成功后在debug文件夹中会产生对应的exe,在cmd中运行后,会在debug文件夹中生成后缀为dyd和err的文件,打开dyd如下图所示:因为没有错误,所以对应的test1.err的文件为空可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。

九、实验结论词法分析器的功能是:从左到右逐个的扫描源程序的字符串,按照词法规则,识别出单词符号作为输出,对识别过程中发现的词法错误,输出有关的错误信息。

十、总结及心得体会通过本次实验,即对词法分析程序的设计,锻炼了自己的编程能力,同时加深了自己对词法分析器的理解和掌握以及对待编译这门课程的理解,提高了自己的动手能力,在编码的过程中也遇到了许多问题,例如如何解决产生的文件后端对齐等等问题,让我的编码能力在此次实验中得到了一定的提高。

十一、对本实验过程及方法、手段的改进建议要先了解词法分析器的功能以及输入输出形式,熟练的掌握状态转化图。

报告评分:指导教师签字:实验参考源代码如下:#include<stdio.h>#include<string.h>#include<Windows.h>#define MAX_COUNT 2048#define ILLEGAL_CHAR_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 <= 'z') || (character >= 'A'&&character <= 'Z')) return true;elsereturn false;}bool digit(char character){if (character >= '0'&&character <= '9')return true;elsereturn false;}void retract(char& character){ungetc(character, stdin);character = NULL;}int reserve(char* token){if (strcmp(token, "begin") == 0)return 1;else if (strcmp(token, "end") == 0)return 2;else if (strcmp(token, "integer") == 0) return 3;else if (strcmp(token, "if") == 0)return 4;else if (strcmp(token, "then") == 0)return 5;else if (strcmp(token, "else") == 0)return 6;else if (strcmp(token, "function") == 0) return 7;else if (strcmp(token, "read") == 0)return 8;else if (strcmp(token, "write") == 0)return 9;elsereturn 0;}int symbol(){return 10;}int constant(){return 11;}void output(const char* token, int kindNum) {printf("%16s %2d\n", token, kindNum);}bool error(int lineNum, int errNum){char* errInfo;switch (errNum){case ILLEGAL_CHAR_ERR:errInfo = "出现字母表以外的非法字符";break;case UNKNOWN_OPERATOR_ERR:errInfo = "出现未知运算符";break;default:errInfo = "未知错误";}if (fprintf(stderr, "***LINE:%d %s\n", lineNum, errInfo) >= 0) return true;elsereturn false;}bool LexAnalyze(){static int lineNum = 1;char character;char token[17] = "";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'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 (letter(character) || digit(character)) {char s[2] = { 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'7':case'8':case'9':while (digit(character)){char s[2] = { character };strcat(token, s);character = getchar();}retract(character);int val;val = constant();output(token, val);break;case'=':output("=", 12);break;case'<':character = getchar();if (character == '>')output("<>", 13);else if (character == '=')output("<=", 14);else{retract(character);output("<", 15);}break;case'>':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);elseerror(lineNum, 2);//输出“未知运算符”错误break;case'(':output("(", 21);break;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);elsestrcpy(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));elsestrncpy(out, in, strlen(in) - strlen(extension));}bool init(int argc, char* argv[]){if (argc != 2){return false;}else{char* inFilename = argv[1];//argv[1];char outFilename[MAX_COUNT] = "";char errFilename[MAX_COUNT] = "";char filename[MAX_COUNT] = "";char path[MAX_COUNT] = "";getFilename(inFilename, filename);getPath(inFilename, path);strcat(outFilename, path);strcat(outFilename, filename);strcat(outFilename, ".dyd");strcat(errFilename, 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;elsereturn false;}}void main(int argc, char* argv[]) {if (init(argc, argv)){while (LexAnalyze()){}}fclose(stdin);fclose(stdout);fclose(stderr);return;}电子科技大学实验报告学生姓名:爸爸学号:2222222222222 指导教师:陈昆实验地点:科研楼A-504 实验时间:2017-05-14一、实验项目名称:递归下降分析器的设计与实现二、实验学时:4学时三、实验原理1.语法分析是对源程序经过词法分析后转换成的单词流按方法规则进行判断,对能构成正确句子的单词流,给出相应的语法树;对不能构成正确句子的单词流判断其语法错误并做出相应处理。

相关主题