南昌大学编译原理实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

编译原理期末实验报告-1-目录词法分析程序设计...............................................................................-2-词法分析程序设计...............................................................................-8-逆波兰式的翻译和计算..........................................................................16编译原理期末实验报告-2-南昌大学实验报告一姓名:马海亮学号:6100409101专业班级:计算机科学与技术091班实验类型:□验证□综合■设计□创新实验日期:2012.4实验成绩:词法分析程序设计一、实验目的掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1、根据状态图,设计词法分析函数intscan(),完成以下功能:1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,2)以二元式形式输出单词单词种类,单词属性其中单词种类用整数表示:0:标识符1:十进制整数2:八进制整数3:十六进制整数运算符和界符,关键字采用一字一符,不编码其中单词属性表示如下:标识符,整数由于采用一类一符,属性用单词表示运算符和界符,关键字采用一字一符,属性为空2、编写测试程序,反复调用函数scan(),输出单词种别和属性。四、实验环境PC微机DOS操作系统或Windows操作系统TurboC程序集成环境或VisualC++程序集成环境五、实验步骤编辑一个文本文件program.txt,在文件中输入如下内容:ifdata+920x3fthendata=data+01;elsedata=data-01;编译原理期末实验报告-3-正确结果:【实验代码】#includeiostream#includeiomanip#includestringusingnamespacestd;FILE*fp;charch;char*keyword[11]={if,else,then,for,while,do,char,double,void,main,const};boolsearch(charsearchstr[])//查找是否是系统关键字或运算符或界符{inti;for(i=0;i=5;i++){if(strcmp(keyword[i],searchstr)==0)returntrue;}returnfalse;}/*******************************************************************/charletterprocess(charch)//字母处理程序{inti=-1;charletter[30];if,-0,data+,-1,92,-3,3fthen,-0,data=,0,data+,-2,1;,-else,-0,data=,-0,data-,-2,-;,-编译原理期末实验报告-4-while(isalnum(ch)!=0){letter[++i]=ch;ch=fgetc(fp);}letter[i+1]='\0';if(search(letter)){coutleft;if(strcmp(keyword[0],letter)==0)coutsetw(12)关键字setw(5)4,setw(6)keyword[0]endl;elseif(strcmp(keyword[1],letter)==0)coutsetw(12)关键字setw(5)5,setw(6)keyword[1]endl;elseif(strcmp(keyword[2],letter)==0)coutsetw(12)关键字setw(5)6,setw(6)keyword[2]endl;elseif(strcmp(keyword[3],letter)==0)coutsetw(12)关键字setw(5)7,setw(6)keyword[3]endl;elseif(strcmp(keyword[4],letter)==0)coutsetw(12)关键字setw(5)8,setw(6)keyword[4]endl;elseif(strcmp(keyword[5],letter)==0)coutsetw(12)关键字setw(5)10,setw(6)keyword[5])endl;elseif(strcmp(keyword[5],letter)==0)coutsetw(12)关键字setw(5)11,setw(6)keyword[6])endl;elseif(strcmp(keyword[5],letter)==0)coutsetw(12)关键字setw(5)12,setw(6)keyword[7])endl;elseif(strcmp(keyword[5],letter)==0)coutsetw(12)关键字setw(5)13,setw(6)keyword[8])endl;elseif(strcmp(keyword[5],letter)==0)coutsetw(12)关键字setw(5)14,setw(6)keyword[9])endl;elseif(strcmp(keyword[5],letter)==0)coutsetw(12)关键字setw(5)15,setw(6)keyword[10])endl;}elseif(letter[0]=='x'||letter[0]=='X'){intk=1;for(intj=1;j=i;j++)if(!(letter[j]='0'&&letter[j]='8')){k=0;break;}if(k==1)coutleftsetw(12)八进制数setw(5)1,setw(6)letterendl;elsecoutsetw(12)left标识符setw(5)0,setw(6)letterendl;gotoa;}else{coutsetw(12)left标识符setw(5)0,setw(6)letterendl;}a:return(ch);}/***********************************************************************************/charnumberprocess(charch)//数字处理程序{inti=-1;charnum[20];while(isdigit(ch)!=0)编译原理期末实验报告-5-{num[++i]=ch;ch=fgetc(fp);}if(isalpha(ch)!=0){while(isspace(ch)==0){num[++i]=ch;ch=fgetc(fp);}num[i+1]='\0';if(num[0]=='0'){if(num[1]=='x'||num[1]=='X'){intk=1;for(intj=2;j=i;j++){if((num[j]='0'&&num[j]='9')||(num[j]='A'&&num[j]='F')||(num[j]='a'&&num[j]='f')){k=0;break;}}if(k==1)coutsetw(12)left十六进制数setw(5)3,setw(6)numendl;elsecoutsetw(12)left标识符setw(5)0,setw(6)numendl;gotou;}}}num[i+1]='\0';if(num[0]=='0'){intk=1;for(intj=1;j=i;j++)if(num[j]='0'&&num[j]='7'){k=0;break;}if(k==1)coutleftsetw(12)八进制数setw(5)2,setw(6)numendl;elsecoutsetw(12)left标识符setw(5)0,setw(6)numendl;gotou;}coutsetw(12)left十进制数setw(5)1,setw(6)numendl;u:return(ch);}/************************************************************************************/charotherprocess(charch)//运算符和界符处理程序{charaaa='@';inti=-1;if(isspace(ch)!=0){ch=fgetc(fp);gotou;编译原理期末实验报告-6-}if((isspace(ch)==0)&&(isalnum(ch)==0)){switch(ch){coutleft;case'+':{ch=fgetc(fp);if(ch=='+')coutsetw(12)算术运算符setw(5)16,setw(6)++endl;elseaaa=ch;coutsetw(12)比较运算符setw(5)23,setw(6)+endl;}break;case'-':{ch=fgetc(fp);if(ch=='-')coutsetw(12)算术运算符setw(5)16,setw(6)--endl;elseaaa=ch;coutsetw(12)算术运算符setw(5)17,setw(6)-endl;}break;case'*':coutsetw(12)算术运算符setw(5)18,setw(6)*endl;break;case'/':coutsetw(12)算术运算符setw(5)19,setw(6)/endl;break;case'':{ch=fgetc(fp);if(ch=='=')coutsetw(12)比较运算符setw(5)21,setw(6)=endl;elseaaa=ch;coutsetw(12)比较运算符setw(5)20,setw(6)=endl;}break;case'':{ch=fgetc(fp);if(ch=='=')coutsetw(12)比较运算符setw(5)22,setw(6)=endl;elseaaa=ch;coutsetw(12)比较运算符setw(5)23,setw(6)endl;}break;case'!':{ch=fgetc(fp);if(ch=='=')coutsetw(12)

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功