编译实习-语法分析_第1页
编译实习-语法分析_第2页
编译实习-语法分析_第3页
编译实习-语法分析_第4页
编译实习-语法分析_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

编号: 实习一二三四五六七八九十总评教师签名成绩编译原理课程实习报告编 号: 3 实习题目: 语法分析器 专业(班): 计科六班 学生学号: 04 学生姓名: 何子龙 任课教师: 杜卓敏 1. 问题定义与分析1.1 实习目的 构造一个小语言的语法分析程序。1.2 实习要求 (1)输入属性字文件,输出源程序是否符合语法要求的结果: 正确该程序符合语法要求。 错误指出错误位置。 (2)运行实例: 例 1: 输入 i:=1+; 输出 表达式错误。 例2: 输入 program ex1;begin i:=1 end. 输出 该程序是正确的。 1.3 要求分析1.3.1 输入部分 输入为文法源程序,定义CString 类型变量 m_EnterString ,用于获取编辑框1的输入,将其转换为char类型的数组,用s 保存,即char *s=m_EnterString.GetBuffer() 。1.3.2 输出部分 对于错误的程序,输出相应错误类型;对于正确的程序,输出该程序是正确的。定义CString 类型变量m_OutputString ,用于输出词法分析结果到编辑框2,用如下函数给m_OutputString 添加输出内容,如程序正确时代码:m_OutputString.Insert(m_OutputString.GetLength(),该程序是正确的);如图所示:1.3.3 待分析的简单语言的语法用扩充的BNF表示如下:=program beginend|beginend:=;:=:=ID:=:=+ | -:=* | /:=ID | NUM | ()1.3.4 语法中的各种单词符号对应的类别码单词符号 类别码单词符号类别码begin118end2=19if320then421else522while6=23program724int8(25char9)26标识符1027常数1128+1229-13;30*14,31/1532=1633:=17#0program34 其中对应于在词法分析程序中,变化的是将关键字do改为program,和begin两者至少出现一个作为程序的开始标志。2. 设计2.1 数据结构 定义了以下字符串类型数据:CString m_EnterString :用于接受编辑框1输入的源程序CString m_OutputString; :用于保存输出到编辑框2的内容,即输出源程序是正确的还是错误的,对于错误的程序还需要说明错误类型char *s=m_EnterString.GetBuffer() :用于将输入的Cstring类型转换为字符数组 类型界面数据结构:(仅在词法分析程序的基础上改变了以下组件的位置与大小)IDC_STATIC1 (Group-box Control) 放输入框的框IDC_STATIC2 (Group-box Control) 放输出框的框IDC_EDIT1 (Edit Control) 输入编辑框IDC_EDIT2 (Edit Control) 输出编辑框IDOK (Button Control) 确定按钮IDCANCEL (Button Control) 取消按钮IDD_CIFA_DIALOG (Dialog) 整个界面框界面如下图所示:2.2. 算法及程序流程图2.2.1算法设计: 算法的基本任务是在已完成的词法分析程序的基础上,对源程序的语法的正确性进行判断,编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析,对于输入的程序无语法错误的源程序,则输出该程序是正确的,若输入的源程序有语法错误,则输出相应的错误类型,具体见流程图。 2.2.1程序流程图如下:A. 主程序示意图如下图所示:输入源程序调用scaner读下一个单词符号调用lrparser结束NNYYprogram或begin?调用scaner调用语句串分析程序end?调用scanersyn=0&kk=0?打印分析成功出错处理YNB. 递归下降分析程序示意图如下图所示:调用statement函数 ;?调用scaner调用statement函数出错处理YNC. 语句串分析过程示意图如下图所示:D. statement语句分析程序流程:NNY调用expression函数标识符?调用scaner:=?调用scaner出错处理YE. expression表达式分析函数如下图所示:N出错处理调用term函数+ , -?调用scaner调用term函数YF. term分析函数如下图所示:调用factor函数* , /?调用scaner调用factor函数出错处理YNNNNNYY标识符?常数?(?调用scaner调用expression函数)?调用scaner出错处理YYG. Factor函数分析过程如下图所示:以上流程图中的出错处理部分,对于不同部分的出错处理在程序中并不一致,而是对应于不同的错误作出相应的错误处理,本程序中即为输出不同的源程序语法错误提示。如:2.3. 界面3. 程序运行实例 3.1 实例1: 以program开头,以end结尾,且无语法错误的程序 3.2 实例2 以begin开头,以end结尾,且无语法错误的程序3.3 非合法语法输入A. 表达式错误: 错误语句:int i:=3+; 表达式不完整错误语句:j:=3*(i-3; 表达式中有“(”无“)”错误语句:j:=5+i)*4; 表达式中有“)”无“(”错误语句:char ch:=c 表达式结束无“;”B. 不以program或begin开关:C. 不以end结尾:4. 部分程序核心源代码void CcyufaDlg:Start()char *s=m_EnterString.GetBuffer(); scaner(); lrparser();m_OutputString.Insert(m_OutputString.GetLength(),# 0rn);int CyufaDlg:lrparser()int schain=0; kk=0; if (syn=1) scaner();schain=yucu();if(syn=6) scaner(); if(syn=0)&(kk=0) printf(该程序是正确的n); else if(kk!=1)printf(结尾无end标志!n); kk=1; getch(); exit(0); else printf(开头无program或begin!n); kk=1; return (schain);void CyufaDlg:scaner() sum=0; for(m=0;m8;m+)tokenm+=NULL; m=0; ch=progp+; while(ch= )ch=progp+; if(ch=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch; ch=progp+; p-; syn=10; tokenm+=0; for(n=0;n=0)&(ch=0)&(ch=9) sum=sum*10+ch-0; ch=progp+;p-;syn=11; else switch(ch) case ) syn=21; else if(ch=) syn=22; else syn=20; p-; break; case :m=0; ch=progp+; if(ch=) syn=24; else syn=23; p-; break; case :m=0; ch=progp+; if(ch=) syn=18; else syn=17; p-; break; case +: syn=13; break; case -: syn=14; break; case *: syn=15;break; case /: syn=16;break; case (: syn=27;break; case ): syn=28;break; case =

温馨提示

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

最新文档

评论

0/150

提交评论