编译原理实验一词法分析器_第1页
编译原理实验一词法分析器_第2页
编译原理实验一词法分析器_第3页
编译原理实验一词法分析器_第4页
编译原理实验一词法分析器_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

PAGE实验报告课程名称编译原理实验名称词法分析器实验类型设计型实验地点405机房实验日期2015/12指导教师专业软件工程班级学号姓名成绩辽宁石油化工大学计算机与通信工程学院实验报告说明1、封面内容(1)课程名称:实验所属的课程的名称。(2)实验名称:要用最简练的语言反映实验的内容。要求与实验指导书中相一致。(3)实验类型:说明是验证型实验、设计型实验、创新型实验还是综合型实验。2、正文内容 实验报告的正文内容须包括以下内容:(1)实验目的:目的要明确,要抓住重点,符合实验指导书中的要求。(2)实验内容:说明本实验的主要内容。(3)实验原理:简要说明本实验项目所涉及的理论知识。(4)实验环境:实验用的软硬件环境(配置)。(5)实验方案:对于验证性型实验,写明依据何种原理、操作方法进行实验;对于设计型和综合型实验,写明依据何种原理、操作方法进行实验,并画出硬件组成图、软件流程图、设计思路和设计方法,再配以相应的文字说明;对于创新型实验,除符合设计型和综合型实验要求外,还应注明其创新点、特色。(6)实验步骤:写明实验的实施步骤,包括实验过程中的记录、数据。(7)实验结果与分析:写明实验的最终结果,并对结果进行分析,做出结论。(8)实验中遇到的问题及解决方法:写明实验过程中遇到的问题及所采取的解决方法。(9)实验总结(在封底上):写出对本次实验的心得体会、思考和建议。12-第页实验目的设计,编制,调试一个词法分析程序-识别单词,加深对词法分析原理的理解。实验要求构造一个自己设计的小语言的词法分析器:1、这个小语言能说明一些简单的变量识别诸如begin,end,if,while等保留字;识别非保留字的一般标识符(有下划线、字符、数字,且第一个字符不能是数字)。识别数字序列(整数和小数);识别:=,<=,>=之类的特殊符号以及;,(,)等界符。2、相关过程(函数):Scanner()词法扫描程序,提取标识符并填入display表中3、这个小语言有顺序结构的语句4、这个小语言能表达分支结构的语句5、这个小语言能够输出结果;算法设计单词种别码设计:状态种别编码种类解释0初态121关键字32变量标识符由字母下划线数字组成,且第一位不能是数字4读入了数字53整数64小数7小数点个数出错,大于18读入了<96双目运算<>、<=105单目运算<11读入了>126双目运算>=135单目运算>145单目运算+、—、*、/、=、#用default实现15读入了:166双目运算:=177界符(、)、,、;、—、[、]、:、{、}、‘’用变量errorflag实现程序源代码1使用环境:vc++6.0,win8;2源代码:#include<iostream>#include<fstream>#include<string>#include<math.h>#include<ctype.h>#include<cstdlib>usingnamespacestd;#defineMax655 #defineWordMaxNum256 //变量最大个数#defineDigitNum256 //常量最大个数#defineMaxKeyWord 32 //关键字数量#defineMaxOptANum8 //运算符最大个数#defineMaxOptBNum4 //运算符最大个数#defineMaxEndNum11 //界符最大个数typedefstructDisplayTable{ intIndex;//标识符所在表的下标 inttype; //标识符的类型 intline; //标识符所在表的行数 charsymbol[20]; //标识符所在表的名称}Table;intTableNum=0;//display表的下标charWord[WordMaxNum][20];//标识符表charDigit[WordMaxNum][20];//数字表intWordNum=0;//变量表的下标intDigNum=0; //常量表的下标boolerrorFlag=0;//错误标志constchar*constKeyWord[MaxKeyWord]={"and","array","begin","case","char""constant","do","else","end","false","for","if","input","integer","not","of","or","output","packed","procedure","program","read","real","repeat","set","then","to","type","until","var","while","with","prn"};//关键字constcharOptA[]={'+','-','*','/','=','#','<','>'};//单目运算constchar*OptB[]={"<=",">=",":=","<>"}; //双目运算符constcharEnd[]={'(',')',',',';','.','[',']',':','{','}','"'};//界符voiderror(charstr[20],intnLine,interrorType){ cout<<"\nError:"; switch(errorType) { case1: cout<<"第"<<nLine-1<<"行"<<str<<"变量的长度超过限制!\n"; errorFlag=1; break; case2: cout<<"第"<<nLine-1<<"行"<<str<<"小数点错误!\n"; errorFlag=1; break; case3: cout<<"第"<<nLine-1<<"行"<<str<<"常量的长度超过限制!\n"; errorFlag=1; break; } }//errorvoidScanner(charch[],intchLen,Tabletable[Max],intnLine){ intchIndex=0; while(chIndex<chLen)//对输入的字符扫描 { while(ch[chIndex]==''||ch[chIndex]==9) {chIndex++;} while(ch[chIndex]==10)//遇到换行符,行数加1 { nLine++;chIndex++;} if(isalpha(ch[chIndex])) { charstr[256]; intstrLen=0; while(isalpha(ch[chIndex])||ch[chIndex]=='_')//是字母、下划线 { str[strLen++]=ch[chIndex]; chIndex++; while(isdigit(ch[chIndex]))//不是第一位,可以为数字 { str[strLen++]=ch[chIndex]; chIndex++; } } str[strLen]=0;//字符串结束符 if(strlen(str)>20)//标识符超过规定长度,报错处理 { error(str,nLine,1); } else{ inti; for(i=0;i<MaxKeyWord;i++) if(strcmp(str,KeyWord[i])==0) { strcpy(table[TableNum].symbol,str); table[TableNum].type=1; table[TableNum].line=nLine; table[TableNum].Index=i; TableNum++; break; } if(i>=MaxKeyWord) { table[TableNum].Index=WordNum; strcpy(Word[WordNum++],str); table[TableNum].type=2;//变量标识符 strcpy(table[TableNum].symbol,str); table[TableNum].line=nLine; TableNum++; } } }elseif(isdigit(ch[chIndex])) { intflag=0; charstr[256]; intstrLen=0; while(isdigit(ch[chIndex])||ch[chIndex]=='.') { if(ch[chIndex]=='.') flag++; str[strLen++]=ch[chIndex]; chIndex++; } str[strLen]=0; if(strlen(str)>20) { error(str,nLine,3); } if(flag==0) { table[TableNum].type=3;//整数 } if(flag==1) { table[TableNum].type=4;//小数 } if(flag>1) { error(str,nLine,2); } table[TableNum].Index=DigNum; strcpy(Digit[DigNum++],str); strcpy(table[TableNum].symbol,str); table[TableNum].line=nLine; TableNum++; }/*******************************运算符************************************/ else { interrorFlag;//用来区分是不是无法识别的标识符,0为运算符,1为界符 charstr[3]; str[0]=ch[chIndex]; str[1]=ch[chIndex+1]; str[3]=0; for(inti=0;i<MaxOptBNum;i++)//MaxOptBNum) if(strcmp(str,OptB[i])==0) { errorFlag=0; table[TableNum].type=6; strcpy(table[TableNum].symbol,str); table[TableNum].line=nLine; table[TableNum].Index=i; TableNum++; chIndex=chIndex+2; break; } if(i>=MaxOptBNum) { for(intk=0;k<MaxOptANum;k++) if(OptA[k]==ch[chIndex]) { errorFlag=0; table[TableNum].type=5; table[TableNum].symbol[0]=ch[chIndex]; table[TableNum].symbol[1]=0; table[TableNum].line=nLine; table[TableNum].Index=k; TableNum++; chIndex++; break; } /*************************界符*****************************************/ for(intj=0;j<MaxEndNum;j++) if(End[j]==ch[chIndex]) { errorFlag=1; table[TableNum].line=nLine; table[TableNum].symbol[0]=ch[chIndex]; table[TableNum].symbol[1]=0; table[TableNum].Index=j; table[TableNum].type=7; TableNum++; chIndex++; }/********************其他无法识别字符*************************************/ if(errorFlag!=0&&errorFlag!=1)//开头的不是字母、数字、运算符、界符 { charstr[256]; intstrLen=-1; str[strLen++]=ch[chIndex]; chIndex++; while(*ch!=''||*ch!=9||ch[chIndex]!=10)// { str[strLen++]=ch[chIndex]; chIndex++; } str[strLen]=0; table[TableNum].type=8; strcpy(table[TableNum].symbol,str); table[TableNum].line=nLine; table[TableNum].Index=-2; TableNum++; } } }}}voidTrans(doublex,intp)//把十进制小数转为16进制{inti=0;//控制保留的有效位数while(i<p){if(x==0)//如果小数部分是0break;//则退出循环else{intk=int(x*16);//取整数部分x=x*16-int(k);//得到小数部分if(k<=9)cout<<k;elsecout<<char(k+55);};i++;};};intmain(){ ifstreamin; ofstreamout,outVar,outCon; charin_file_name[26],out_file_name[26];//读入文件和写入文件的名称 charch[Max];//存放输入代码的缓冲区 intnLine=1; //初始化行数Table*table=newTable[Max]; intchoice; cout<<"请输入读入方式:1:从文件中读,2:从键盘读(输入结束标志位#):\n"; cin>>choice; switch(choice) { inti;/****************************从文件读取***************************/ case1: cout<<"Entertheinputfilename:\n"; cin>>in_file_name; in.open(in_file_name); if(in.fail())//打开display表读文件失败 { cout<<"Inputputfileopeningfailed.\n"; exit(1); } cout<<"Entertheoutputfilename:\n"; cin>>out_file_name; out.open(out_file_name); outVar.open("变量表.txt"); outCon.open("常量表.txt"); if(out.fail())//打开display表写文件失败 { cout<<"Outputfileopeningfailed.\n"; exit(1); } if(outVar.fail())//打开变量表写文件失败 { cout<<"VarOutputfileopeningfailed.\n"; exit(1); } if(outCon.fail())//打开常量表写文件失败 { cout<<"ConstOutputfileopeningfailed.\n"; exit(1); } in.getline(ch,Max,'#'); Scanner(ch,strlen(ch),table,nLine);//调用扫描函数 if(errorFlag==1)//出错处理 return0;/*******************************把结果打印到各个表中***********************/ out<<"类型"<<" "<<"下标"<<endl; for(i=0;i<TableNum;i++)//打印display out<<"(0x"<<hex<<table[i].type<<" , "<<"0x"<<hex<<table[i].Index<<")"<<endl;//在文件testout.txt中输出 outCon<<"下标"<<""<<"常量值"<<endl; for(i=0;i<TableNum;i++)//打印常量表 { if(table[i].type==3) { longnum1; num1=atoi(table[i].symbol); outCon<<"(0x"<<hex<<table[i].Index<<" , "<<"0x"<<hex<<num1<<")"<<endl; } if(table[i].type==4) { doublenum2; num2=atof(table[i].symbol); outCon<<"(0x"<<hex<<table[i].Index<<" , "<<"0x"<<hex<<num2<<")"<<endl; } } outVar<<"类型"<<" "<<"变量名称"<<endl; for(i=0;i<WordNum;i++)//打印变量表 outVar<<"(0x"<<hex<<i<<" "<<Word[i]<<")"<<endl;//在文件testout.txt中输出 in.close();//关闭文件 out.close(); outVar.close(); outCon.close(); break;/***********************************从键盘输入****************************/ case2: cin.getline(ch,Max,'#'); Scanner(ch,strlen(ch),table,nLine);//调用扫描函数 if(errorFlag==1) return0; cout<<"\nDisplay表:\n"; cout<<"类型"<<" "<<"下标"<<endl;//dos界面下 for(i=0;i<TableNum;i++) cout<<"(0x"<<hex<<table[i].type<<" , "<<"0x"<<hex<<table[i].Index<<")"<<endl; cout<<"\n常量表:\n"<<"下标"<<""<<"常量值"<<endl; for(i=0;i<TableNum;i++)//打

温馨提示

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

评论

0/150

提交评论