您好,欢迎访问三七文档
.教育资料武汉理工大学学生实验报告书实验课程名称编译原理开课学院计算机科学与技术学院指导老师姓名饶文碧学生姓名学生专业班级学生学号实验课成绩.教育资料—学年第学期实验课程名称:编译原理实验项目名称单词的词法分析实验成绩实验者专业班级组别同组者实验日期第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。实验要求:(1)选择常用高级程序设计语言(如Pascal、C语言、PL/0语言)的源程序作为词法分析对象。(2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词,并把其转换成属性字输出。二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)#includestring.h#includestdio.h#includestdlib.h#includectype.hchar*table[7]={,main,int,if,then,else,return},TOKEN[20],ch;//定义关键字intlookup(char*TOKEN){//关键字匹配函数intm,i;for(i=1;i6;i++){if((m=strcmp(TOKEN,table[i]))==0)return(i);}return(0);}.教育资料voidout(intc,char*TOKEN){//输出函数printf((%d,%s)\n,c,TOKEN);}voidscanner(FILE*fp){//扫描函数charTOKEN[20]={'\0'};charch;inti,c;ch=fgetc(fp);//fp并自动指向下一个字符if(isalpha(ch)){//判断该字符是否是字母TOKEN[0]=ch;ch=fgetc(fp);i=1;while(isalnum(ch)){//判断该字符是否是字母或数字TOKEN[i]=ch;i++;ch=fgetc(fp);}TOKEN[i]='\0';fseek(fp,-1,1);//回退一个字符c=lookup(TOKEN);if(c==0)out(6,TOKEN);//输出标识符elseout(c,TOKEN);//输出关键字}elseif(isdigit(ch)){//判断是否是数字TOKEN[0]=ch;ch=fgetc(fp);i=1;while(isdigit(ch)){TOKEN[i]=ch;i++;ch=fgetc(fp);}TOKEN[i]='\0';fseek(fp,-1,1);out(7,TOKEN);}else{TOKEN[0]=ch;switch(ch){case'{':out(17,TOKEN);break;case'}':out(18,TOKEN);break;.教育资料case',':out(14,TOKEN);break;case';':out(15,TOKEN);break;case'':ch=fgetc(fp);TOKEN[1]=ch;if(ch=='='){out(9,TOKEN);}elseif(ch==''){out(11,TOKEN);}else{fseek(fp,-1,1);out(8,TOKEN);}break;case'=':out(10,TOKEN);break;case'':ch=fgetc(fp);TOKEN[1]=ch;if(ch=='=')out(13,TOKEN);else{fseek(fp,-1,1);out(12,TOKEN);}break;default:printf(error!\n);break;}}}voidmain(){FILE*fp;if((fp=fopen(D:\\ZHT.txt,r))==NULL){//读取文件内容,并返回文件指针,该指针指向文件的第一个字符fprintf(stderr,erroropening.\n);exit(1);}do{ch=fgetc(fp);if(ch=='#')//文件以#结尾作为扫描结束条件break;if(ch=='')//如果是空格,自动跳到下个字符scanner(fp);.教育资料else{fseek(fp,-1,1);//如果不是空格,则回退一个字符并扫描scanner(fp);}}while(ch!='#');return(0);}三、主要仪器设备及耗材VC6.0第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)、分隔符、标识符、无符号常数中,即二元式编码形式输出。每次调用词法分析程序它均能自动继续扫描下去形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等).教育资料三、实验小结、建议及体会1、通过本次实验对词法分析的过程有了进一步的了解,并把理论知识应用于试验。2、在编写程序过程中也遇到了很多困难,不过最终通过老师同学的帮助得到了解决。为以后编程积累了一些小知识。3、程序实现功能很有限,以后会继续改进。实验课程名称:编译原理实验项目名称赋值语句的翻译程序设计实验成绩实验者专业班级组别同组者实验日期第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)对于常用高级语言(如Pascal、C语言)的源程序从左到右进行扫描,把其中赋值语句用所学过的语法分析方法进行语法分析,采用最有代表性的语义分析方法将其转换为中间代码形式表示输出。实验要求(1)选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归下降分析法、LL分析法和LR分析法之一进行语法分析。(2)选择对各种常见程序语言都通用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。(3)选择最有代表性的语义分析方法,如语法制导翻译方法进行语义翻译工作。(4)实习时间为4~6小时。二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)voidmain(){.教育资料intg,h,i,j,l,p,y,z,count;inta[10];//状态栈intni[10];//存放输出逆波兰式的参数charb[10];//符号栈charstr[10];//放输入的表达式charc1;inttop1,top2,top3,top,topn,m,n;charx;charcopy[10];//放Si,ri,看移进还是归约charcopy1[10];charvt[6]={'+','*','i','(',')','#'};//存放非终结符charvn='E';//存放终结符char*LR[4]={E-E+E,E-E*E,E-(E),E-i};//存放产生式};top1=0;top2=0;top3=0;top=0;topn=0;a[0]=0;y=a[0];b[0]='#';count=0;z=0;cout文法G[E]:endl;cout'\t'(1)E::=E+Eendl;cout'\t'(2)E::=E*Eendl;cout'\t'(3)E::=(E)|iendl;cout文法G[E]合法句子举例:i+i*iendl;cout*************************************************************endl;cout请输入符号串:endl;.教育资料cinstr;l=strlen(str);str[l]='#';for(i=l+1;i10;i++){str[i]=NULL;}coutendl'\t''\t'符号串str分析过程如下:endl;cout-----------------------------------------------------------------endl;cout步骤'\t'状态栈'\t''\t'符号栈'\t''\t'输入串'\t''\t'ACTION'\t'GOTOendl;do{y=z;m=0;n=0;//y,z指向状态栈栈顶g=top;j=0;x=str[top];count++;coutcount'\t';while(m=top1){//输出状态栈couta[m];m=m+1;}cout'\t''\t';while(n=top2){//输出符号栈coutb[n];n=n+1;}cout'\t''\t';.教育资料str[top-1]='';coutstr;//输出输入串cout'\t''\t';while(x!=vt[j]&&j=6)j++;//vt[6]={'+','*','i','(',')','#'}存放终结符if(j==6&&x!=vt[j]){coutendl-----------------------------------------------------------------endl;coutendl输入字符串不是该文法的一个句子!endl;coutendl按任意数字或字母键,回车退出!endl;cini;return;}if(action[y][j]==NULL){coutendl-----------------------------------------------------------------endl;coutendl输入字符串不是该文法的一个句子!endl;coutendl按任意数字或字母键,回车退出!endl;cini;return;}else//couty=yj=jaction[y][j];strcpy(copy,action[y][j]);if(copy[0]=='S'){//处理移进z=copy[1]-'0';top1=top1+1;top2=top2+1;a[top1]=z;//a[10]状态栈b[top2]=x;//b[10]符号栈x=str[top]top=top+1;.教育资料i=0;while(copy[i]!='#'){coutcopy[i];i++;}coutendl;}//couty=yj=jaction[y][j];if(copy[0]=='r'){//处理归约i=0;while(copy[i]!='#'){coutcopy[i];i++;}h=copy[1]-'0';ni[topn]=h;topn=topn+1;h=h-1;strcpy(copy1,LR[h]);//*LR[4]={E-E+E#,E-E*E#,E-(E)#,E-i#}存放产生式//while(copy1[0]!=vn[0])k++;//vn[1]={'E'}存放非终结符l=strlen(LR[h]);top1=top1-l+3;y=a[top1];//couttop1=top1;//y=h-1;p=goto1[y];top2=top2-l+4;top1=top1+1;a[top1]=p;.教育资料b[top2]=copy1[0];z=p;cout'\t';coutpendl;}}while(action[y][j]!=acc);coutaccendl;coutendl
本文标题:编译原理实验报告2
链接地址:https://www.777doc.com/doc-5548285 .html