编译课程设计报告书
- 格式:doc
- 大小:2.89 MB
- 文档页数:37
《编译原理》课程设计报告一、课程设计目的通过课程设计进一步理解高级语言在计算机中的执行过程,了解现代编译器的运作机制,加深对编译原理中重点算法和编译技术的理解,提高自己自学和理解的能力。
学会如何利用已有软件JFLex、Java_cup对词法分析器及语法分析器的构造。
二、设计概述本tiger语言编译器的编译过程涉及到编译五个阶段中的二个,即词法分析器、语法分析器。
其中语法分析后还完成了语法树的打印的构造以及类型检查。
词法分析器由JFLex编译正则式生成,词法分析器编译产生式生成,语法分析器由CUP生成。
结果通过GUI界面呈现在使用者面前。
编译程序需要在单词级别上来分析和翻译源程序,所以首先要识别出单词,而词法分析部分的任务是:从左至右扫描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。
因此,词法分析是编译的基础。
执行词法分析的程序称为词法分析器。
语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。
三、设计过程(一)设计构思程序主要完成三大功能模块:词法分析器、语法分析器、GUI人机交互界面。
词法分析器由JFLex编译正则式生成,其中必须为外界提供一个获取记号流的接口,实验中定为java_cup.runtime.Symbol next_token。
语法分析器是建立在词法分析器上的,故必须包含词法分析器以便获得记号流,next_token为语法分析器提供TOKEN,语法分析器的对外接口是:java_cup.runtime.Symbol debug_parse(),同时返回语法树的根节点。
GUI 界面是提供人机交互的,它能够依次显示词法分析阶段分析得到的所有TOKEN 的信息,语法阶段生成的语法树,另外对于词法和语法阶段出现的错误在“错误提示”文本框中一一列举出来,提供用户改进代码的信息。
课程设计报告( 2021--2022年度第一学期)名称:编译技术课程设计题目:算符优先分析法研究院系:班级:学号:学生姓名:指导教师:设计周数:一周成绩:日期:2021年12 月31日1 课程设计的目的和要求1.1 课程设计的目的本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。
设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术。
1.2 课程设计的要求1. 文法使用产生式来定义;2. 分别给出每一个非终结符的FIRSTVT和LASTVT集。
3. 画出算符优先关系表;4. 判定给定的文法是否是算符优先文法;5. 给定符号串判定是否是文法中的句子,分析过程用分析表格的方式打印出来。
2 系统描述举例如下:本次实验使用Visual Studio 2019软件,利用只规定终结符之间的优先关系的自底向上移进-规约法实现对算符优先分析法的研究,输出非终结符的FIRSTVT和LASTVT集,算符优先关系表和对句子的分析表格,均在DOS窗口显示。
2.1 文法的描述G[S]: S->#E#;E->E+T|T;F-P!F|P;T->T*F|F;P->(E)|i2.2 属性文法的描述表2-1 条件语句及其语义规则3 概要设计3.1 概要设计(体现系统的设计思路和主要功能)主要步骤包括:用户自己输入文法,实质上是算数表达式的计算。
构建每个非终结符的FirstVT()和LastVT()集。
构建优先关系符号表。
构建词法分析的程序。
编写主函数,用户输入文法对语句利用算符优先文法进行判别。
算法的主体思想:用栈存储已经看到的输入符号,用优先关系指导移动归约语法分析器的动作,如果栈顶的终结符和下一个输入符之间的优先关系是<或=,则语法分析器移动,表示还没有发现句柄的右端,如果是>关系,就调用归约。
3.2 开发环境实验采用C++程序语言进行设计开发工具为Visual Studio 20194 详细设计4.1 系统的类图图4-1 文法类图4.2 主要算法的流程图图4-2 求非终结符的FIRSTVT 和LASTVT 集流程图求LASTVT 集的过程与此类似,但符号串的扫描顺序是从后开始若产生式右部第一个字符为非终结符 则直接将其加入first 集中else first[x].insert(str[0]);寻找该非终结符 的first 集 dfs(y);将该非终结符的first 集也加进去for (; it != first[y].end(); it++)first[x].insert(*it);if (isupper(str[0]))若产生式右部第一个字符为非终结符 string& left = VN_set[x].left;string&str = VN_set[x].right[i];产生产生式左部非终结符的FIRSTVT 集图4-3 构造算符优先关系表流程图图4-4 对输入串进行算符优先分析流程图4.3 数据分析与定义char relation[MAX][MAX]; //算符优先关系表vector<char> VT;vector<WF> VN_set; //类型为文法的数组VN_setmap<string, int> VN_dic; //map映射,一条产生式对应的第几条的序号set<char> first[MAX]; //FIRSTVT集set<char> last[MAX]; //LASTVT集4.4 系统界面设计用户输入文法个数和每条产生式的内容后,输出结果格式如下:分为:产生式、FIRSTVT集、;LASTVT集、算符优先关系表和分析过程图4-5 系统输出界面概况5 测试方法和测试结果5.1 测试用例1输入如程序5-1所示。
编译技术课程设计班级软件1001学号姓名指导老师2013年 6 月目录一、目的 (2)二、任务及要求 (2)三、实验环境 (4)四、实现过程说明 (4)1.词法分析器 (4)(1)单词符号表 (4)(2)数据结构 (4)(3)函数说明 (5)(4)流程图 (5)2.语法分析器 (7)(1)分析方法说明 (7)(2)文法 (7)(3)数据结构 (9)(4)函数说明 (10)3.中间代码生成器 (10)(1)属性文法 (10)(2)数据结构 (10)(3)函数说明 (11)(4)流程图 (11)五、程序运行结果 (12)六、总结 (19)一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。
二、任务及要求基本要求:1.词法分析器产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内码值如下表:对于这个小语言,有几点重要的限制:首先,所有的关键字(如if﹑while等)都是“保留字”。
所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。
例如,下面的写法是绝对禁止的: if(5)=x其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。
也就是说,对于关键字不专设对应的转换图。
但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。
当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。
再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。
例如,一个条件语句应写为 if i>0 i= 1;而绝对不要写成ifi>0 i=1;因为对于后者,我们的分析器将无条件地将ifi看成一个标识符。
编译课程设计报告课程设计任务书学生姓名:马惠枝专业班级:计算机0902班指导教师:工作单位:计算机科学与技术学院题目: FOR循环语句的翻译程序设计(LL(1)法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。
时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2010年 11月23日系主任(或责任教师)签名: 2010年 11月 23日FOR循环语句的翻译程序设计---- LL(1)法、输出四元式1.系统描述1.1程序设计要求通过设计、编制、调试一个FOR( )循环语句的词法、语法及语义分析程序,实现对于FOR( )循环语句的翻译,加深对LL(1)文法的认识,掌握这种自顶向下的文法分析方法。
首先,设计出一个关于FOR( )循环语句的文法,通过消除左递归使它符合LL(1)即递归下降法的要求;然后按照这个文法构造出文法的预测分析表、及文法橘子的分析过程,通过仔细的研究之后设计出一个集词法分析、语法分析和语义分析为一体的程序,从文法开始法号根据相应的产生式推到出相应的句子,最终输出四元式形式的中间代码。
编译原理课程设计报告一、目的与要求目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。
达到进一步了解程序编译过程的基本原理和基本实现方法的目的。
要求:对PL/0作以下修改扩充:基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:+= 和-=(2)扩充语句REPEAT<语句序列>UNTIL <条件>其中,<条件>是循环条件,即条件不成立时,重复执行循环体的< 语句序列>;条件成立时,循环结束。
选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加运算:++ 和--。
(2)增加类型:①字符类型;②实数类型。
(3)扩充函数:①有返回值和返回语句;②有参数函数。
(4)增加一维数组类型(可增加指令)。
(5)其他典型语言设施。
二、实验环境与工具(1)计算机及操作系统:PC机,WindowsXP(2)程序设计语言:C(3)教学型编译程序:PL/0三、设计方案(1)概述:源、目标语言,实现工具(平台),运行平台源语言: PL/0目标语言: 目标代码(生成的文件后缀为*.COD)实现平台: VC++ 6.0运行平台: WindowsXP(2)结构设计说明:各功能模块描述Error()出错处理,打印出错位置和错误编码GetCh()漏掉空格,读取一个字符GetSym()词法分析,读取一个单词GEN()目标代码生成过程,本过程用于把生成的目标代码写入目标代码数组,供后面的解释器解释执行TEST()测试当前单词是否合法过程testENTER()登陆符号表过程enterPOSITION() 在符号表中查找指定符号所在位置的函数position,如果找不到就返回0V ARDECLARATION()变量声明LISTCODE()列出目标代码清单;FACTOR()因子处理过程factorTERM()项处理过程term;EXPRESSION()表达式处理过程CONDITION()条件处理过程STATEMENT()语句处理过程BLOCK()语法分析过程BASE(): 通过静态链求出数据区基地址的函数,INTERPRET ():对目标代码解释运行过程(3)主要成分描述①符号表struct tablestruct{char name[al]; /* 名字*/enum object kind; /* 类型:const ,var ,procedure*/int val; /* 数值,仅const 使用*/int level; /* 所处层,仅const 不使用*/int adr; /* 地址,仅const 不使用*/Int size; /* 需要分配的数据区空间*/};struct tablestruct table[txmax]; /* 名字表*/②运行时存储组织和管理由于编译时目标程序运行的数据空间大小已经规定,所以存储组织属于静态存储。
交叉编译课程设计报告一、课程目标知识目标:1. 理解交叉编译的基本概念、原理及作用;2. 掌握交叉编译工具链的安装与配置方法;3. 学会使用交叉编译工具链编译简单的程序;4. 了解交叉编译在嵌入式系统开发中的应用。
技能目标:1. 能够独立安装和配置交叉编译工具链;2. 能够运用交叉编译工具链编译简单的程序;3. 能够分析并解决交叉编译过程中遇到的问题;4. 能够将交叉编译技术应用于实际项目开发。
情感态度价值观目标:1. 培养学生对交叉编译技术的好奇心和求知欲;2. 培养学生独立思考、解决问题的能力;3. 培养学生团队协作、沟通交流的能力;4. 增强学生对我国嵌入式产业发展的认识,激发学生的爱国情怀。
课程性质:本课程为信息技术学科选修课程,适用于高年级学生。
学生特点:学生已具备一定的编程基础,对嵌入式系统有一定了解,具备独立解决问题的能力。
教学要求:结合学科特点,注重理论与实践相结合,以学生为主体,充分调动学生的积极性与参与度。
通过本课程的学习,使学生能够掌握交叉编译技术的基本原理和应用,为后续的嵌入式系统开发奠定基础。
在教学过程中,将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 交叉编译基本概念与原理- 交叉编译的定义与作用- 交叉编译工具链的组成与工作原理2. 交叉编译工具链的安装与配置- 编译器的选择与下载- 交叉编译工具链的安装步骤- 环境变量配置与测试3. 交叉编译实践- 编写简单的C程序- 使用交叉编译工具链编译程序- 分析编译过程中可能出现的问题及解决方法4. 交叉编译在嵌入式系统开发中的应用- 交叉编译在嵌入式项目开发中的重要性- 交叉编译在典型嵌入式系统开发中的应用案例教学大纲:第一课时:交叉编译基本概念与原理第二课时:交叉编译工具链的安装与配置第三课时:交叉编译实践(上)第四课时:交叉编译实践(下)第五课时:交叉编译在嵌入式系统开发中的应用教学内容安排与进度:第一课时:讲解交叉编译的定义、作用,介绍交叉编译工具链的组成与工作原理;第二课时:指导学生安装与配置交叉编译工具链;第三课时:讲解编写简单C程序,引导学生使用交叉编译工具链进行编译;第四课时:分析编译过程中可能出现的问题,指导学生解决;第五课时:介绍交叉编译在嵌入式系统开发中的应用案例,激发学生学习兴趣。
广西大学编译原理课程设计专业:计算机科学与技术姓名:课程:编译原理指导教师:目录一.程序简介与分析---------------------------------------------------------1 二.程序适用范围-----------------------------------------------------------1 三.词法分析---------------------------------------------------------------1 四.语法分析---------------------------------------------------------------3 五.语义分析和中间代码生成------------------------------------------------9 六.代码生成--------------------------------------------------------------11 七.流程图----------------------------------------------------------------12 八.实现------------------------------------------------------------------13 九.程序运行结果----------------------------------------------------------13 十.总结------------------------------------------------------------------18 十一.附录(源程序)--------------------------------------------------------19简单的编译程序设计一.程序简介与分析本程序由四个部分组成:词法分析子程序,语法分析子程序,语义分析子程序,目标代码生成程序。
《编译原理课程设计》报告MiniC编译器MFC实现分组序号:5设计地点:微机301、401电子邮件:1260815873@ 指导教师:李村合技术支持:CSDN下载:百度文库下载:2011 年 12 月 24 日目录1前言 (1)2课程设计目的 (2)3课程设计内容 (2)4编译器特色 (2)5课程设计原理 (2)6系统需求分析 (6)6.1MiniC编译程序总体流程图 (7)6.2功能需求 (8)6.3主要用到的关键词: (10)6.4汇编成可运行文件 (10)6.5MiniC语言的BNF文法 (10)7系统设计与实现 (12)7.1BY5编译程序主要模块功能 (12)7.2词法分析子程序 (13)7.3语法语义分析子程序 (18)7.3.1分程序处理过程 (18)7.3.2变量定义过程 (19)7.3.3语句处理过程 (19)7.3.4赋值语句的处理 (21)7.3.5read语句的处理 (22)7.3.6write语句的处理 (23)7.3.7call语句的处理 (24)7.3.8if语句的处理 (24)7.3.9while语句的处理 (25)7.3.10表达式、项、因子处理 (25)7.3.11逻辑表达式的处理 (26)7.3.12判断单词合法性与出错恢复过程分析: (29)8系统测试与运行结果分析 (29)8.1.1测试程序: (29)8.1.2测试结果 (33)9心得体会 (35)1前言编译原理是大学计算机课程中比较难的一门课程,理论性相对较强,因而实践很重要,但多年以来国内并未有比较好的开源项目,不免心中可惜。
作者参考陆晓春版的CMinus编译器,制作完成了BY5编译程序。
这是本人的编译原理课程设计程序,现整理开源,以期抛砖引玉,帮助众多的编译器设计爱好者。
本程序据陆晓春的CMinus改编而来,特别感谢他的辛勤付出和无私的贡献,本着GNU 的原则,特公开本程序,供大家能够实现自己的编译程序。
《编译原理》设计方案报告一、项目概述二、课程目标本课程的主要目标是使学生能够掌握编译器的设计与实现原理,理解编译过程中的各个环节,以及掌握常见的编译器构建工具和技术。
具体目标如下:1.理解编译器的基本原理和工作流程;2.掌握常见的编译器构建工具和技术;3.能够独立设计和实现简单的编译器;4.培养学生的系统设计和问题解决能力。
三、课程内容本课程的主要内容包括:1.编译器的概念和基本原理;2.词法分析器和语法分析器的设计与实现;3.语义分析和中间代码生成;4.优化和目标代码生成;5.编译器构建工具和技术。
四、教学方法本课程采用以学生为中心的教学方法,主要包括以下几种教学手段:1.模块化教学:将课程内容分为多个模块,每个模块进行独立的教学和实践;2.理论与实践相结合:通过理论课、实验课等形式,使学生能够将理论知识应用到实际中;3.项目驱动教学:引入编译器设计与实现的实际项目,让学生能够在实践中巩固所学的知识;4.小组合作学习:将学生分成小组,进行协作学习,增强学生的团队合作能力。
五、评价方式为了评价学生对课程内容的掌握程度,本课程采用以下评价方式:1.平时成绩:包括课堂表现、作业和实验成绩等;2.项目成果:针对编译器设计与实现的项目,评价学生的项目成果和实现质量;3.期末考试:以闭卷考试形式对学生的总体掌握情况进行评价。
六、项目进度安排本课程的项目进度安排如下:1.第1-2周:介绍编译器的概念和基本原理;2.第3-6周:词法分析器和语法分析器的设计与实现;3.第7-9周:语义分析和中间代码生成;4.第10-12周:优化和目标代码生成;5.第13-14周:编译器构建工具和技术;6.第15-16周:项目演示和总结。
七、教学资源支持为了支持本课程的教学,我们将提供以下教学资源:1.教材:选用经典的编译原理教材,如《编译原理》(龙书)等;2.课件:编写详细的课件,包括理论知识和实践案例;3.实验指导:编写实验指导书,引导学生进行编译器设计与实现的实践;4. 实验环境:提供编译器构建工具和开发环境,如Lex/Flex、Yacc/Bison等。
编译技术课程设计——表达式的小型编译器专业:计算机1201学生姓名:贺茂纯指导教师:年轶完成时间:2015年7月2日一、目的 _________________________________________________ 1二、题目 _________________________________________________ 1三、要求 _________________________________________________ 11.词法分析___________________________________________ 12.语法分析___________________________________________ 13.代码生成___________________________________________ 24.错误处理___________________________________________ 2四、实验环境 _____________________________________________ 2五、系统实现 _____________________________________________ 21.词法分析___________________________________________ 22.语法分析___________________________________________ 43.中间代码___________________________________________ 64.错误处理___________________________________________ 8六、程序运行结果 _________________________________________ 91.准确的语句分析______________________________________ 92.错误的算术表达式___________________________________ 13七、总结 ________________________________________________ 16一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
课程设计报告( 2012 -- 2013年度第 1 学期)名称:编译技术课程设计B题目:词法分析器设计算符优先分析程序设计基于算符优先分析方法的语法制导翻译程序设计院系:计算机系班级:计科1001学号: 201009010121学生姓名:苏航指导教师黄志强阎蕾岳燕设计周数:1周成绩:日期:2013年1月11日《编译技术》课程设计B任务书一、目的与要求1.词法分析器设计的目的与要求1.1 词法分析器设计的实验目的本实验是为计算机科学与技术专业、网络工程专业、信息安全专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
1.2 词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。
为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。
单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。
单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。
表1-1 单词符号及其内部表示单词符号种别编码单词的属性值BEGIN IF THEN ELSE END标识符整型常数+ 12345678—————在名字表中的地址十进制整数—* ** ()9101112————2.算符优先分析程序设计的目的和要求2.1 算符优先分析程序设计的实验目的本实验是为计算机科学与技术等专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现通用算符优先分析算法的方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
2.2 算符优先分析程序设计的实验要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。
算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用,本题目给出文法的目的是为了便于对语法分析结果进行验证。
(1)文法设算符优先文法G为:TTEE|+→FFTT|*→PFPF|↑→iEP|)(→说明:i为整型常数或者为标识符表示整型变量;使用中↑用**表示。
(2)优先关系表设优先关系表如表1-2所示。
表1-2 优先关系表+ * ↑ i ( ) #+*↑i()#3.基于算符优先分析方法的语法制导翻译程序设计的目的和要求3.1基于算符优先分析方法的语法制导翻译程序设计的实验目的本实验是为计算机科学与技术等专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术, 通过设计、编写和调试语法制导翻译程序,掌握从一种语句的语法和语义出发,构造相应的语义子程序,实现基于算符优先分析方法的语法制导翻译的方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
3.2 基于算符优先分析方法的语法制导翻译程序设计的实验要求算符优先分析方法是通过反复把输入符号移进分析栈,使用优先关系表在分析栈顶寻找最左素短语,将其归约为一个非终结符号而实现的。
这个分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。
基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作(即语义分析),每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语义子程序,去完成相应的语义翻译工作,这步归约使用的产生式对非终结符号不加区分(即将所有的非终结符号用一个通用的非终结符号表示)。
语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。
4.上机前的准备为了充分利用上机时间,在进行编译技术上机实验前应做好各种准备工作,具体应包括:(1)复习与上机题目有关的知识,熟悉有关定义、概念和实现算法。
(2)设计出程序流程框图和数据结构,编写出完整的源程序,进行静态检查。
(3)为所编写的程序构思一个运行、调试环境,例如,以什么方式提供输入数据、显示输出数据,如何调用(或启动)编写的程序。
制定出程序调试计划和典型输入代码数据。
5.课程设计报告课程设计完成后,按学校给定的格式和要求写出课程设计报告。
二、主要内容完成以下课程设计内容:1.完成词法分析器设计,实现输入源程序字符串,每调用一次扫描器,就输出一个以内部形式表示的单词符号,输出形式为二元式:(种别编码,单词属性)2.完成算符优先分析程序设计,掌握实现通用算符优先分析算法的方法,实现输入终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。
3.完成基于算符优先分析方法的语法制导翻译程序设计,实现输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。
三、进度计划序设计内容完成时间备注号1 查阅资料,编译器各部分概要设计一天2 词法分析器设计一天3 算符优先分析程序设计一天4 基于算符优先分析方法的语法制导翻译程一天半序设计5 验收交实验报告半天已完成的学生验收交实验报告四、设计成果要求1.按进度计划和自己的能力完成课程设计内容要求,包括程序框图、源程序、调试步骤、调试方法、对运行结果的分析等。
2.总结整个课程设计,撰写出课程设计报告。
五、考核方式1.程序调试完成后,由指导教师在计算机上检查,验收课程设计成果,并现场答辩。
2.评阅课程设计报告。
学生姓名:(签字)指导教师:编译课程教学组年月日实验一.词法分析器的设计与实现一、课程设计(综合实验)的目的与要求1.1 词法分析器设计的实验目的本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
1.2 词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。
为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。
单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。
单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。
表1-1 单词符号及其内部表示单词符号种别编码单词的属性值BEGIN IF THEN ELSE END标识符整型常数+***()123456789101112—————在名字表中的地址十进制整数—————二、设计(实验)正文 1.词法分析器流程图2.词法分析器设计程序代码 #include <iostream> #include <string> #include <iomanip> using namespace std; int what(char a) { if((int(a)>=48)&&(int(a)<=57)) { return 0;//0-9数字 } else开始结束初始化读入需要分析的句子还有单词未分析?否是 是字母?是否 其他单词分析程序是数字?否输出单词二元式关键字或标识符分析程序读一个字符是常数分析程序if((int(a)>=97)&&(int(a)<=122)){return 1;//a-z的字母}else{return 2;//其他的标点符号}}void scan(char a[],int &m,char zc[100][100],int &n){cout.setf(ios::left);char zh[100];int b=0,weizhi,r=0;int zbbm;//-----------------------------检测整形常数while(a[m]==' '){cout<<"遇到空格"<<endl;m++;}if(what(a[m])==0){while(what(a[m])==0){b=b*10+int(a[m])-48;m++;}static int d=0;d=d+1;zbbm=7;cout<<"<"<<setw(9)<<setfill(' ')<<b;cout<<","<<setw(9)<<setfill(' ')<<zbbm<<","<<d<<">"<<endl;}else//----------------------------------检测字符型if(what(a[m])==1){if((a[m]=='b')&&(a[m+1]=='e')&&(a[m+2]=='g')&&(a[m+3]=='i')&&(a[m+4]=='n')&&(wha t(a[m+5])==2)){m=m+5;zbbm=1;cout<<"<"<<"begin"<<" "<<","<<setw(9)<<setfill('')<<zbbm<<",->"<<endl;}//=====检测beginelseif((a[m]=='i')&&(a[m+1]=='f')&&(what(a[m+2])==2)){m=m+2;zbbm=2;cout<<"<"<<"if"<<" "<<","<<setw(9)<<setfill('')<<zbbm<<",->"<<endl;}//检测ifelseif((a[m]=='t')&&(a[m+1]=='h')&&(a[m+2]=='e')&&(a[m+3]=='n')&&(what(a[m+4])==2)){m=m+4;zbbm=3;cout<<"<"<<"then"<<" "<<","<<setw(9)<<setfill('')<<zbbm<<",->"<<endl;}//检测thenelseif((a[m]=='e')&&(a[m+1]=='l')&&(a[m+2]=='s')&&(a[m+3]=='e')&&(what(a[m+4])==2)){m=m+4;zbbm=4;cout<<"<"<<"else"<<" "<<","<<setw(9)<<setfill('')<<zbbm<<",->"<<endl;}//检测elseelseif((a[m]=='e')&&(a[m+1]=='n')&&(a[m+2]=='d')&&(what(a[m+3])==2)){m=m+3;zbbm=5;cout<<"<"<<"end"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;}//检测end//----------------------------对未知字符的检测else{int j=0;while(what(a[m])!=2){zh[j]=a[m];m++;j++;}zh[j]='#';if(n==0){j=0;while(zh[j]!='#'){zc[0][j]=zh[j];j++;}zc[0][j]='#';n=1;weizhi=1;}elseif(n>0){int k=0,y=1;while((k<n)&&(y==1)){r=0;while(zc[k][r]!='#'){r++;}if(r!=j){k++;y=1;}elseif(r==j){r=0;while((int(zc[k][r])==int(zh[r]))&&(r<j)){r++;}if(r==j){weizhi=k+1;y=0;}else{k++;y=1;}}}if(y==1){j=0;while(zh[j]!='#'){zc[n][j]=zh[j];j++;}zc[n][j]='#';n=n+1;weizhi=n;}}zbbm=6;//怎么输出地址cout<<"<";for(int i=0;i<j;i++){cout<<zh[i];}for(int i=0;i<(9-j);i++)cout<<" ";cout<<","<<setw(9)<<setfill('')<<zbbm<<","<<weizhi<<">"<<endl;}}elseif(what(a[m])==2){if(a[m]=='+'){zbbm=8;m++;cout<<"<"<<"+"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;}//检测+elseif(a[m]=='('){zbbm=11;m++;cout<<"<"<<"("<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;}//检测(elseif(a[m]==')'){zbbm=12;m++;cout<<"<"<<")"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;}//检测)elseif(a[m]=='*'){if(a[m+1]=='*'){zbbm=10;m+=2;cout<<"<"<<"**"<<""<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;}else{zbbm=9;m++;cout<<"<"<<"*"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",-)"<<endl;}}else{cout<<"无此类字符!"<<endl;m++;}}}void main(){char zc[100][100];int n=0;cout<<"begin------------1"<<endl;cout<<"if ------------2"<<endl;cout<<"then ------------3"<<endl;cout<<"else ------------4"<<endl;cout<<"end ------------5"<<endl;cout<<"标志符------------6"<<endl;cout<<"整型常数------------7"<<endl;cout<<"+------------8"<<endl;cout<<"*------------9"<<endl;cout<<"**------------10"<<endl;cout<<"(------------11"<<endl;cout<<")------------12"<<endl;cout<<"========================================================="<<e ndl;cout<<endl;int m=0;char a[100];cout<<"请输入测试语句:";cin.getline(a,100,'\n');cout<<"输出格式为:"<<endl;cout<<"<单词符号,种别编码,单词的属性值>"<<endl;while(a[m]!='#'){scan(a,m,zc,n);}system ("pause");}3.词法分析器运行结果实验二. 算符优先分析的设计与实现一、课程设计(综合实验)的目的与要求2.1 算符优先分析程序设计的实验目的本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。