收藏 分享(赏)

编译实习-语法分析.doc

上传人:gsy285395 文档编号:4428036 上传时间:2018-12-28 格式:DOC 页数:19 大小:534.33KB
下载 相关 举报
编译实习-语法分析.doc_第1页
第1页 / 共19页
编译实习-语法分析.doc_第2页
第2页 / 共19页
编译实习-语法分析.doc_第3页
第3页 / 共19页
编译实习-语法分析.doc_第4页
第4页 / 共19页
编译实习-语法分析.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、0编号: 实习 一 二 三 四 五 六 七 八 九 十 总评 教师签名成绩编译原理课程实习报告编 号: 实习题目: 语法分析器 专业(班): 学生学号: 学生姓名: 任课教师: 年 月 日11. 问题定义和分析1.1 实习目的1.2 实习要求1.3 要求分析2. 程序设计 2.1. 数据结构 2.2. 算法及程序流程图2.3. 界面3. 程序运行实例3.1 实例 1 3.2 实例 2 3.3 非合法语法输入4. 部分程序核心源代码5. 总结21. 问题定义与分析1.1 实习目的构造一个小语言的语法分析程序。1.2 实习要求 (1)输入属性字文件,输出源程序是否符合语法要求的结果:正确该程序符合

2、语法要求。 错误指出错误位置。 (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 ,用

3、于输出词法分析结果到编辑框2,用如下函数给m_OutputString 添加输出内容,如程序正确时代码:3m_OutputString.Insert(m_OutputString.GetLength(),“该程序是正确的“ );如图所示:1.3.3 待分析的简单语言的语法用扩充的 BNF 表示如下: =program beginend|beginend: = ;: = :=ID:=: =+ | -:=* | /: =ID | NUM | ()41.3.4 语法中的各种单词符号对应的类别码单词符号 类别码 单词符号 类别码begin 1 21else 5 22while 6 = 23progra

4、m 7 24int 8 ( 25char 9 ) 26标识符 10 27常数 11 28+ 12 29- 13 ; 30* 14 , 31/ 15 32= 16 33:= 17 # 0program 34其中对应于在词法分析程序中,变化的是将关键字 do 改为 program,和begin 两者至少出现一个作为程序的开始标志。2. 设计2.1 数据结构定义了以下字符串类型数据:CString m_EnterString :用于接受编辑框1输入的源程序CString m_OutputString; :用于保存输出到编辑框 2 的内容,即输出源程序是正确的还是错误的,对于错误的程序还需要说明错误类

5、型5char *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_D

6、IALOG (Dialog) 整个界面框界面如下图所示:62.2. 算法及程序流程图2.2.1 算法设计:算法的基本任务是在已完成的词法分析程序的基础上,对源程序的语法的正确性进行判断,编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析,对于输入的程序无语法错误的源程序,则输出该程序是正确的,若输入的源程序有语法错误,则输出相应的错误类型,具体见流程图。 2.2.1 程序流程图如下:A. 主程序示意图如下图所示:7B. 递归下降分析程序示意图如下图所示:输入源程序调用 scaner 读下一个单词符号调用 lrparser结束NNYYprogram 或 begin?

7、调用 scaner调用语句串分析程序end?调用 scanersyn=0 表达式不完整错误语句:j:=3*(i-3; 表达式中有“ (”无“) ”14错误语句: j:=5+i)*4; 表达式中有“) ”无“(”错误语句:char ch:=c 表达式结束无 “;”15B. 不以 program 或 begin 开关:C. 不以 end 结尾:164. 部分程序核心源代码void CcyufaDlg:Start()char *s=m_EnterString.GetBuffer();scaner();lrparser();m_OutputString.Insert(m_OutputString.Ge

8、tLength(),“# 0rn“);int CyufaDlg:lrparser()int schain=0;kk=0;if (syn=1) scaner();schain=yucu();if(syn=6) scaner();if(syn=0)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;m=a)|(ch=A) while(ch=a)|(ch=A)

9、|(ch=0)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;18else 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 =: sy

10、n=25;break;case ;: syn=26;break;case #: syn=0;break;default: syn=-1;break;5. 总结通过此次实验,自己动手写这样一个简单的语法分析器,通过设计、编制并调试语法分析器,加深对语法分析原理的理解;了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner 函数读下一个单词符号调用 lrparser()结束。递归下降分析的大致流程为:“先判断是否为 program 或 begin”都不是则“出错处理” ,若是其一则“调用 scaner()函数” 调用语句串分析函数 “判断是否为 end”不是则“ 出错处理” ,若是则调用scaner 函数“判断 syn=0&kk=0 是否成立”成立则说明分析成功输出“该程序是正确的” 。不成立则“出错处理” ,以同错误输出相应错误提示;熟悉了构造语法分析程序的手工方式的相关原理,在使用 C+中 MFC编写程序的过程中,也加强了自己的编程练习。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 外语学习 > 语法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报