欢迎来到天天文库
浏览记录
ID:31683179
大小:72.18 KB
页数:16页
时间:2019-01-17
《中南大学软件学院编译原理实验报告2》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、中南大学软件学院编译原理实验报告实验:实验二班级:姓名:学号:实验二预测分析法设计与实现一、实验目的加深对语法分析器工作过程的理解;加强对预测分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。二、实验内容在实验1的基础上,用预测分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。三、实验要求:1.对语法规则有明确的定义;2.编写的分析程序能够对实验一的结果进行正确的语法分析;3.对于遇到的语法错误,能够做击简单的错误处理,给出简单的错误提示,保证顺利完成语法分
2、析过程;4.实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现。实验步骤1.定义目标语言的语法规则;2.求解预测分析方法需要的符号集和分析表;3.依次读入实验一的分析结果,根据预测分析的方法进行语法分析,直到源程序结束;4.对遇到的语法错误做岀错误处理。五、设计思路和实现过程木实验是使用LL(1)方法实现的语法分析器,我是用的是MFC实现的设计思路分为以下几步:1、先读入输入串,判断输入串有没有语法错误,如有语法错误,提示第几个语法错误,退出;2、将“或”语句拆开,如果有左递归,消除左递归;3、判断可以产牛空字符的
3、非终结符,将其储存在一个数组中;4、计算非终结符的first集,follow集;5>计算select集;6、创建预测分析表;7、对照预测分析表对句子进行分析,输岀每一步的操作。六、错误处理1、如果未输入文法,则提示输入文法;2、如果文法有错误,既不是以类似于“S->”开头的,则提示错误发生在第几行;3、如果文法不是I丄(1)文法,程序会予以提示;4、如果句子不是以结尾的,或者句子屮含有大写字母的,予以提示;5、计算follow集时,如果follownumkey大丁•某个值,则可认定求follow集陷入死循环,即有右递归或间接右递归,此时跳岀去,终止死循环。七
4、、关键代码1、voidCGranunaana1ysisD1g::OnChange(){intn=0;UpdateDataO;inti,nLineCount=mgranuna1.GetLineCount();//mgramma是与edit控件关联的变量CStringstrText;//Dumpeverylineoftextoftheeditcontrol.for(i=0;i5、i));m_grammal.GetLine(i,strText.GetBuffer(len),Ion);strText.ReleaseBuffer(len);if(strText.IsEmpty())break;if(!getin(i,strText))//整理return;//MessageBox(strText);〃输出得到的每彳亍数据}mgramma.Empty();Delpare();//消除左递归dcduceO_colec();//将所有能推导出0的非终符放在数组colcc0[30]中SelectCollection();//创建select集Es6、tabpreanatabO;//创建预测分析表key二1;boolCGrammaanalysisDlg::gctin(inti,CStringstrLino)//整理{char1ine_no=i+‘O';if(!isupper(strLine[0])7、8、strLine[l]l--9、strLine[2]I->'){CStringerror二"TheSyntaxonline/z+(CString)lineno+〃iswrong!pleasecheckandenteragain:〃;MessageBox(error);returnfalse;}else{in10、tm=0;for(intj二0;j11、'){stotax[sto_tax][m++]=strLine[j];continue;}else{stotax[sto_tax][m]=, ‘;sto_tax++;stotax[stotax][0]=stotax[stotaxT][0];stotax[sto_tax][l]=stotax[sto_tax-l][1];stotax[stotax][2]=stotax[sto_tax-l][2];m=3;continue;}}stotax[12、stotax][m]=, ‘;stotax++;i
5、i));m_grammal.GetLine(i,strText.GetBuffer(len),Ion);strText.ReleaseBuffer(len);if(strText.IsEmpty())break;if(!getin(i,strText))//整理return;//MessageBox(strText);〃输出得到的每彳亍数据}mgramma.Empty();Delpare();//消除左递归dcduceO_colec();//将所有能推导出0的非终符放在数组colcc0[30]中SelectCollection();//创建select集Es
6、tabpreanatabO;//创建预测分析表key二1;boolCGrammaanalysisDlg::gctin(inti,CStringstrLino)//整理{char1ine_no=i+‘O';if(!isupper(strLine[0])
7、
8、strLine[l]l--
9、strLine[2]I->'){CStringerror二"TheSyntaxonline/z+(CString)lineno+〃iswrong!pleasecheckandenteragain:〃;MessageBox(error);returnfalse;}else{in
10、tm=0;for(intj二0;j11、'){stotax[sto_tax][m++]=strLine[j];continue;}else{stotax[sto_tax][m]=, ‘;sto_tax++;stotax[stotax][0]=stotax[stotaxT][0];stotax[sto_tax][l]=stotax[sto_tax-l][1];stotax[stotax][2]=stotax[sto_tax-l][2];m=3;continue;}}stotax[12、stotax][m]=, ‘;stotax++;i
11、'){stotax[sto_tax][m++]=strLine[j];continue;}else{stotax[sto_tax][m]=, ‘;sto_tax++;stotax[stotax][0]=stotax[stotaxT][0];stotax[sto_tax][l]=stotax[sto_tax-l][1];stotax[stotax][2]=stotax[sto_tax-l][2];m=3;continue;}}stotax[
12、stotax][m]=, ‘;stotax++;i
此文档下载收益归作者所有