编译实验报告 华北电力大学 阎蕾_第1页
编译实验报告 华北电力大学 阎蕾_第2页
编译实验报告 华北电力大学 阎蕾_第3页
编译实验报告 华北电力大学 阎蕾_第4页
编译实验报告 华北电力大学 阎蕾_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

科技学院课程设计报告(2011--2012年度第1学期)名称:编译技术课程设计B题目:简单编译程序的设计与实现院系:信息工程系班级:学号:学生姓名:指导教师:阎蕾黄建才设计周数:1周成绩:日期:年月日PAGEPAGE3实验一.词法分析器的设计与实现一、课程设计(综合实验)的目的与要求1.1词法分析器设计的实验目的本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。1.2词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。表1-1单词符号及其内部表示单词符号种别编码单词的属性值BEGINIFTHENELSEEND标识符整型常数+***()123456789101112—————在名字表中的地址十进制整数—————二、设计(实验)正文1.词法分析器流程图2.词法分析器设计开始结束开始结束初始化读入需要分析的句子还有单词未分析?否是是字母?是否其他单词分析程序是数字?否输出单词二元式关键字或标识符分析程序读一个字符是常数分析程序//first.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include<iostream>#include<string>usingnamespacestd;intwhat(chara){ if((int(a)>=48)&&(int(a)<=57)) { return0;//0-9数字 } else if((int(a)>=97)&&(int(a)<=122)) { return1;//a-z的字母 } else { return2;//其他的标点符号 }}voidscan(chara[],int&m,charzc[100][100],int&n){ charzh[100]; intb=0,weizhi,r=0; intzbbm; //检测整形常数 while(a[m]=='') { cout<<"遇到空格"<<endl; m++; } if(what(a[m])==0) { while(what(a[m])==0) { b=b*10+int(a[m])-48; m++; } zbbm=7; cout<<"("<<zbbm<<","<<b<<")"<<endl; } else //检测字符型 if(what(a[m])==1) { if((a[m]=='b')&&(a[m+1]=='e')&&(a[m+2]=='g')&&(a[m+3]=='i')&&(a[m+4]=='n')&&(what(a[m+5])==2)) { m=m+5; zbbm=1; cout<<"("<<zbbm<<",-)"<<endl; }//=====检测begin else if((a[m]=='i')&&(a[m+1]=='f')&&(what(a[m+2])==2)) { m=m+2; zbbm=2; cout<<"("<<zbbm<<",-)"<<endl; }//检测if else if((a[m]=='t')&&(a[m+1]=='h')&&(a[m+2]=='e')&&(a[m+3]=='n')&&(what(a[m+4])==2)) { m=m+4; zbbm=3; cout<<"("<<zbbm<<",-)"<<endl; }//检测then else if((a[m]=='e')&&(a[m+1]=='l')&&(a[m+2]=='s')&&(a[m+3]=='e')&&(what(a[m+4])==2)) { m=m+4; zbbm=4; cout<<"("<<zbbm<<",-)"<<endl; }//检测else else if((a[m]=='e')&&(a[m+1]=='n')&&(a[m+2]=='d')&&(what(a[m+3])==2)) { m=m+3; zbbm=5; cout<<"("<<zbbm<<",-)"<<endl; }//检测end //对未知字符的检测 else { intj=0; while(what(a[m])!=2) { zh[j]=a[m]; m++; j++; } zh[j]='#'; if(n==0) { j=0; while(zh[j]!='#') { zc[0][j]=zh[j]; j++; } zc[0][j]='#'; n=1; weizhi=1; } else if(n>0) { intk=0,y=1; while((k<n)&&(y==1)) { r=0; while(zc[k][r]!='#') { r++; } if(r!=j) { k++;y=1; } else if(r==j) { r=0; while((int(zc[k][r])==int(zh[r]))&&(r<j)) { r++; } if(r==j) { weizhi=k+1; y=0; } else {k++;y=1;} } } if(y==1) { j=0; while(zh[j]!='#') { zc[n][j]=zh[j]; j++; } zc[n][j]='#'; n=n+1; weizhi=n; } } zbbm=6;//怎么输出地址 cout<<"("<<zbbm<<","<<weizhi<<")"<<endl; } } else if(what(a[m])==2) { if(a[m]=='+') { zbbm=8; m++; cout<<"("<<zbbm<<",-)"<<endl; }//检测+ else if(a[m]=='(') { zbbm=11; m++; cout<<"("<<zbbm<<",-)"<<endl; }//检测( else if(a[m]==')') { zbbm=12; m++; cout<<"("<<zbbm<<",-)"<<endl; }//检测) else if(a[m]=='*') { if(a[m+1]=='*') { zbbm=10; m+=2; } else { zbbm=9; m++; } cout<<"("<<zbbm<<",-)"<<endl; } }}intmain(){ charzc[100][100]; intn=0; cout<<"begin1"<<endl; cout<<"if2"<<endl; cout<<"then3"<<endl; cout<<"else4"<<endl; cout<<"end5"<<endl; cout<<"标志符6"<<endl; cout<<"整型常数7"<<endl; cout<<"+8"<<endl; cout<<"*9"<<endl; cout<<"**10"<<endl; cout<<"(11"<<endl; cout<<")12"<<endl; cout<<"========================================================="<<endl; cout<<endl; intm=0; chara[100]; cout<<"请输入测试语句:"; cin.getline(a,100,'\n'); cout<<"输出格式为:(种别编码,单词的属性值)"<<endl; while(a[m]!='#') { scan(a,m,zc,n); } return0;}3.词法分析器运行结果实验二.算符优先分析的设计与实现一、课程设计(综合实验)的目的与要求2.1算符优先分析程序设计的实验目的本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术,设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现通用算符优先分析算法的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。2.2算符优先分析程序设计的实验要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用,本题目给出文法的目的是为了便于对语法分析结果进行验证。(1)文法设算符优先文法为:说明:i为整型常数或者为标识符表示整型变量;使用中↑用**表示。(2)优先关系表设优先关系表如表1-2所示。表1-2优先关系表+*↑i()#+*↑i()#二、设计(实验)正文1.算符优先分析流程图开始开始结束初始化,显示算符优先矩阵打开需要读入的文档a的优先关系大于arry[]中最后一个终结符??是是Array为空?否是将array[]中优先关系一样的字符规约为N构造字符串s[],存储需要分析的句子从s[]中读取一个字符a将a压入数组array[]2.程序代码//third.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include<iostream>#include"malloc.h"usingnamespacestd;structLchar{ charchar_ch; structLchar*next;}LLchar,*p,*h,*temp,*top,*base;inttable[7][7]={{1,-1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,0,0,1,1},{-1,-1,-1,-1,-1,-1,0},{1,1,1,0,0,1,1},{-1,-1,-1,-1,-1,0,-1}};//存储算符优先关系表,大于为,小于或等于为-1,其它为表示出charcurchar;charcurcmp;inti,j;intk;intpush(charpchar)/*入栈函数*/{ temp=(Lchar*)malloc(sizeof(LLchar)); temp->char_ch=pchar; temp->next=top; top=temp; return0;}intpop()/*出栈函数*/{ if(top->char_ch!='#') top=top->next; return0;}intchange(charch)/*将字符转为数字,以得到算符优先值*/{ intt; switch(ch) { case'+':t=0;break; case'*':t=1;break; case'|':t=2;break; case'i':t=3;break; case'(':t=4;break; case')':t=5;break; case'#':t=6; } returnt;}intfenxi(){ intright=0; k=1; for(;;) { curchar=h->char_ch; temp=top; for(;;) { if(temp->char_ch=='N') { temp=temp->next; k++; } else { curcmp=temp->char_ch; break; } } cout<<endl<<table[i][j]<<""<<""; temp=top; for(;;)/*打印栈*/ { cout<<temp->char_ch; if(temp->char_ch=='#') break; else temp=temp->next; } cout<<""; temp=h; for(;;)/*打印待比较的字符*/ { cout<<temp->char_ch; if(temp->char_ch=='#') break; else temp=temp->next; } i=change(curcmp); j=change(curchar); if(table[i][j]==0)/*算符优先值为空*/ { cout<<endl<<"错误"<<""<<table[i][j]<<""<<""<<curcmp<<""<<curchar; right=0; break; } else/*算符优先值不为空*/ { if(table[i][j]<0)/*算符优先值为-1,移进*/ { if(curchar=='#')/*待比较字符为空*/ { if(k==2)/*当前比较字符在栈的位置为两个元素*/ break; else { cout<<endl<<"错误"<<""<<table[i][j]<<""<<""<<curcmp<<""<<curchar; right=0; break; } } push(curchar); k=1; curcmp=curchar; h=h->next; } else/*算符优先值为,归约*/ { if(curcmp=='i')/*当前比较为i,出栈一次*/ pop(); else/*当前比较不为i,出栈三次*/ { pop(); pop(); pop(); } push('N');/*归约到N*/ k=1; } } } return0;}intmain(void){ charch; intright=1; base=(Lchar*)malloc(sizeof(LLchar)); base->next=NULL; base->char_ch='#'; top=base; h=(Lchar*)malloc(sizeof(LLchar)); h->next=NULL; p=h; cout<<"输入待比较字符串,以'#'结束"<<endl; do{/*输入待比较字符串,以'#'结束*/ cin>>ch; if(ch=='i'||ch=='+'||ch=='*'||ch=='|'||ch=='('||ch==')'||ch=='#') { temp=(Lchar*)malloc(sizeof(LLchar)); temp->next=NULL; temp->char_ch=ch; h->next=temp; h=h->next; } else { cout<<"输入错误,请重新输入,以#结束"<<endl; } }while(ch!='#');/*输入待比较字符串,以'#'结束*/ p=p->next; h=p; fenxi();/*开始识别*/ if(right) cout<<endl<<"YES"<<endl; else cout<<endl<<"NO"<<endl; return0;}3.实验运行结果如下:实验三.基于算符优先分析方法的语法制导翻译的设计与实现一、课程设计(综合实验)的目的与要求3.1基于算符优先分析方法的语法制导翻译程序设计的实验目的本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术,通过设计、编写和调试语法制导翻译程序,掌握从一种语句的语法和语义出发,构造相应的语义子程序,实现基于算符优先分析方法的语法制导翻译的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。3.2基于算符优先分析方法的语法制导翻译程序设计的实验要求算符优先分析方法是通过反复把输入符号移进分析栈,使用优先关系表在分析栈顶寻找最左素短语,将其归约为一个非终结符号而实现的。这个分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作(即语义分析),每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语义子程序,去完成相应的语义翻译工作,这步归约使用的产生式对非终结符号不加区分(即将所有的非终结符号用一个通用的非终结符号表示)。语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。二、设计(实验)正文1.程序流程图如下开始结束初始化,显示算符优先矩阵开始结束初始化,显示算符优先矩阵打开需要读入的文档da的优先关系大于arry[]中最后一个终结符??是是Array为空?否是将array[]中优先关系一样的字符规约为临时变量或中间变量,如有产生四元式则输出构造字符串s[],存储需要分析的句子从digital[]中读取一个字符da将da压入数组array[]对s[]里的每个字符进行模数转换,存入digital[]//second.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include<iostream>#include"malloc.h"usingnamespacestd;structLchar{ charchar_ch; structLchar*next;}LLchar,*p,*h,*temp,*top,*base,*tp,*y;inttable[7][7]={{1,-1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,0,0,1,1},{-1,-1,-1,-1,-1,-1,0},{1,1,1,0,0,1,1},{-1,-1,-1,-1,-1,0,-1}};//存储算符优先关系表,大于为,小于或等于为-1,其它为表示出charcurchar;charcurcmp;charw;chara,b,c,d,e;intright=0;/*设置开关项,当出错时为*/inti,j;intk;intx=0;voidpush(charpchar)/*入栈函数*/{ temp=(Lchar*)malloc(sizeof(LLchar)); temp->char_ch=pchar; temp->next=top; top=temp;}voidpop()/*出栈函数*/{ if(top->char_ch!='#') w=top->char_ch; top=top->next;}intchange(charch)/*将字符转为数字,以得到算符优先值*/{ intt; switch(ch) { case'+':t=0;break; case'*':t=1;break; case'|':t=2;break; case'i':t=3;break; case'(':t=4;break; case')':t=5;break; case'#':t=6; } returnt;}intdosome(){ intright; k=1; for(;;) { curchar=h->char_ch; temp=top; for(;;) { if(temp->char_ch=='N') { temp=temp->next; k++; } else { curcmp=temp->char_ch; break; } } cout<<endl<<table[i][j]<<""<<""; temp=top; for(;;)/*打印栈*/ { cout<<temp->char_ch; if(temp->char_ch=='#') break; else temp=temp->next; } cout<<""; temp=h; for(;;)/*打印待比较的字符*/ { cout<<temp->char_ch; if(temp->char_ch=='#') break; else temp=temp->next; } i=change(curcmp); j=change(curchar); if(table[i][j]==0)/*算符优先值为空*/ { cout<<endl<<"错误"<<""<<table[i][j]<<""<<""<<curcmp<<""<<curchar; right=0; break; } else/*算符优先值不为空*/ { if(table[i][j]<0)/*算符优先值为-1,移进*/ { if(curchar=='#')/*待比较字符为空*/ { if(k==2)/*当前比较字符在栈的位置为两个元素*/ break; else { cout<<endl<<"错误"<<""<<table[i][j]<<""<<""<<curcmp<<""<<curchar; right=0; break; } } push(curchar); k=1; curcmp=curchar; h=h->next; } else/*算符优先值为,归约*/ { if(curcmp=='i')/*当前比较为i,出栈一次*/ { pop(); d=w; a=w; push('N');/*归约到N*/ k=1; } else

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论