当前位置:文档之家› 编译原理标准实验报告

编译原理标准实验报告

电子科技大学实验报告学生姓名:学号:指导教师:实验地点:实验时间:一、实验室名称:计算机学院软件工程实验室二、实验项目名称:词法分析器的设计与实现三、实验学时:4学时四、实验原理1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。

词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。

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

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

五、实验目的通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。

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

七、实验器材(设备、元器件)1.操作系统:Windows XP2.开发工具:VC6.03.普通PC即可八、实验步骤(1)启动VC6.0,创建空白工程项目。

选择菜单中的“文件”->“新建”->“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C++ 项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。

(2)建立相应的单词符号与种别对照表;(3)根据状态转换图编写相应的处理函数;(4)完成词法分析器;(5)编译与调试以上程序;(6)生成相应的*.dyd文件,作为后面语法分析的输入文件。

九、实验数据及结果分析可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。

十、实验结论本实验程序较好地完成了词法分析程序的设计与实现,能够对所给文法的程序进行词法分析,在没有词法错误的时候生成相应的二元式文件。

该实验程序可一次性给出源程序中的词法错误。

十一、总结及心得体会通过该实验,对词法分析程序的设计,以及运用C语言进行编程有了更深刻的理解,同时加深了自己对词法分析程序的原理的理解与掌握,提高了自己的动手能力。

十二、对本实验过程及方法、手段的改进建议程序设计合理,代码可进一步优化。

报告评分:指导教师签字:本实验参考源代码如下:#include <string>#include <iostream>#include <stdio.h>using namespace std;char ch,cache;bool retracted,ended;int num,cur_line;string token;void clear_output(){f reopen("example.dyd","w",stdout);f close(stdout);f reopen("LexAnalyze.err","w",stdout);f close(stdout);}struct pair_val{s tring s;i nt val;};void getnbc(){i f (retracted){ch=cache;retracted=false;}e lse ch=getchar();w hile (ch==' '||ch=='\n'){if (ch=='\n'){printf("%16s 24\n","EOLN");cur_line++;}ch=getchar();}}void concat(){t oken+=ch;}bool letter(){i f (ch>='A'&&ch<='Z') return true;i f (ch>='a'&&ch<='z') return true;r eturn false;}bool digit(){i f (ch>='0'&&ch<='9') return true; r eturn false;}void retract(){r etracted=true;c ache=ch;}int reserve(){i f (token=="begin") return 1;if (token=="end") return 2;if (token=="integer") return 3;i f (token=="if") return 4;i f (token=="then") return 5;i f (token=="else") return 6;i f (token=="function") return 7;i f (token=="read") return 8;i f (token=="write") return 9;r eturn 0;}void return_val(pair_val v){f reopen("example.dyd","a+",stdout);w hile (v.s.length()<16) v.s=' '+v.s;c out<<v.s<<' ';p rintf("%2d\n",v.val);i f (!(retracted&&cache!=' '&&cache!='\n')) {getnbc();if (ch==EOF){printf("%16s 25\n","EOF");ended=true;}retract();}f close(stdout);}void error(int type){f reopen("LexAnalyze.err","a+",stdout);p rintf("***LINE%d: ",cur_line);i f (type==0) printf("illegal operator\n");e lse printf("unknown character\n");f close(stdout);}void LexAnalyze(){p air_val ret;t oken="";g etnbc();s witch(ch){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()||digit()){concat();ch=getchar();}retract();num=reserve();if (num!=0){ret.s=token;ret.val=num;return_val(ret);}else{ret.s=token;ret.val=10;return_val(ret);}break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':while (digit()){concat();ch=getchar();}retract();ret.s=token;ret.val=11;return_val(ret);break;case '=':ret.s="=";ret.val=12;return_val(ret); case '<':ch=getchar();if (ch=='>'){ret.s="<>";ret.val=13;return_val(ret);}else if (ch=='='){ret.s="<=";ret.val=14;return_val(ret);}else{retract();ret.s="<";ret.val=15;return_val(ret);}break;case '>':ch=getchar();if (ch=='='){ret.s=">=";ret.val=16;return_val(ret);}else{retract();ret.s=">";ret.val=17;return_val(ret);}break;case '-':ret.s="-";ret.val=18;return_val(ret);break;case '*':ret.s="*";ret.val=19;return_val(ret);break;case ':':ch=getchar();if (ch=='='){ret.s=":=";ret.val=20;return_val(ret);}else error(0);break;case '(':ret.s="(";ret.val=21;return_val(ret);break;case ')':ret.s=")";ret.val=22;return_val(ret);break;case ';':ret.s=";";ret.val=23;return_val(ret);break;default:error(1);}}int main(){f reopen("example.pas","r",stdin);c lear_output();r etracted=ended=false;c ur_line=1;w hile (!ended){LexAnalyze();}r eturn 0;}电子科技大学实验报告学生姓名:学号:指导教师:实验地点:实验时间:一、实验室名称:计算机学院软件工程实验室二、实验项目名称:递归下降分析器的设计与实现三、实验学时:12学时四、实验原理1.语法分析是对源程序经过词法分析后转换成的单词流按方法规则进行判断,对能构成正确句子的单词流,给出相应的语法树;对不能构成正确句子的单词流判断其语法错误并做出相应处理。

相关主题