中南大学软件学院编译原理实验报告2.docVIP

中南大学软件学院编译原理实验报告2.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
中南大学软件学院编译原理实验报告2

中南大学软件学院 编译原理 实验报告 实验:实验二 班级: 姓名: 学号: 实验二 预测分析法设计与实现 一、实验目的 加深对语法分析器工作过程的理解;加强对预测分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。 二、实验内容 在实验1的基础上,用预测分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。 三、实验要求: 对语法规则有明确的定义; 编写的分析程序能够对实验一的结果进行正确的语法分析; 对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程; 实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现。 四、实验步骤 定义目标语言的语法规则; 求解预测分析方法需要的符号集和分析表; 依次读入实验一的分析结果,根据预测分析的方法进行语法分析,直到源程序结束; 对遇到的语法错误做出错误处理。 设计思路和实现过程 本实验是使用LL(1)方法实现的语法分析器,我是用的是MFC实现的设计思路分为以下几步: 先读入输入串,判断输入串有没有语法错误,如有语法错误,提示第几个语法错误,退出; 将“或”语句拆开,如果有左递归,消除左递归; 判断可以产生空字符的非终结符,将其储存在一个数组中; 计算非终结符的first集,follow集; 计算select集; 创建预测分析表; 对照预测分析表对句子进行分析,输出每一步的操作。 错误处理 如果未输入文法,则提示输入文法; 如果文法有错误,既不是以类似于“S-”开头的,则提示错误发生在第几行; 如果文法不是LL(1)文法,程序会予以提示; 如果句子不是以“#”结尾的,或者句子中含有大写字母的,予以提示; 计算follow集时,如果follownumkey大于某个值,则可认定求follow集陷入死循环,即有右递归或间接右递归,此时跳出去,终止死循环。 关键代码 1、 void CGrammaanalysisDlg::OnChange() { int n=0; UpdateData(); int i, nLineCount = m_gramma1.GetLineCount();//m_gramma是与edit控件关联的变量 CString strText; // Dump every line of text of the edit control. for (i=0; i nLineCount; i++) //检测每一句文法输入是否正确 { // length of line i: int len = m_gramma1.LineLength(m_gramma1.LineIndex(i)); m_gramma1.GetLine(i, strText.GetBuffer(len), len); strText.ReleaseBuffer(len); if(strText.IsEmpty()) break; if(!getin(i,strText))//整理 return; // MessageBox(strText);//输出得到的每行数据 } m_gramma.Empty(); Delpare(); //消除左递归 deduce0_colec(); //将所有能推导出0的非终符放在数组colec0[30]中 Select_Collection(); //创建select集 Estab_preanatab(); //创建预测分析表 key=1; } 2、 bool CGrammaanalysisDlg::getin(int i,CString strLine)//整理 { char line_no = i+0; if (!isupper(strLine[0])||strLine[1]!=-||strLine[2]!=) { CString error=The Syntax on line +(CString)line_no+ is wrong! please check and enter again:\n; MessageBox(error); return false; } else { int m=0; for(int j=0;jstrLine.GetLength();j++) { if(strLine[j]!=|) { stotax[sto_tax][m++]=strLine[j]; continue; } e

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档