广工编译原理课程设计(参考格式)
- 格式:doc
- 大小:616.58 KB
- 文档页数:14


课程设计报告( 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所示。
项目名称PL/0语言的扩充学院计算机学院专业班级学号姓名指导教师2013年1 月 3 日一.课程设计目的 0二.课程设计要求 0基本内容: 0选做内容: 0已实现的功能: 0三.编译环境与工具 0四.结构设计说明 01.PL/0编译程序的结构图 02.PL/0编译程序的过程或函数的功能表 (1)3.PL/0编译程序的总体流程图 (1)4.PL/0编译程序的中间代码 (2)5.PL\0的编译程序的过程和函数的功能 (3)五.课程设计的设计与步骤 (3)1.扩充赋值运算:+=-=*=/=++和-- (5)2.增加P ASCAL的FOR语句 (15)3.一维数组 (17)六.调试测试 (19)1.+= -= *= /= ++ --的测试 (19)2.FOR语句的测试 (21)3.数组的调试 (22)4.综合调试 (23)七.课程设计总结 (25)【参考文献】 (26)一.课程设计目的在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。
达到进一步了解程序编译过程的基本原理和基本实现方法的目的。
二.课程设计要求基本内容:(1)扩充赋值运算:*= 和 /=(2)扩充语句(Pascal的FOR语句):①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>其中,语句①的循环变量的步长为2,语句②的循环变量的步长为-2。
(3)增加运算:++ 和 --。
选做内容:(1)增加类型:①字符类型;②实数类型。
(2)扩充函数:①有返回值和返回语句;②有参数函数。
(3)增加一维数组类型(可增加指令)。
(4)其他典型语言设施。
已实现的功能:(1)扩充赋值运算:*=和 /= (另外也扩充了+= 和 -=)(2)扩充语句(Pascal的FOR语句):①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>(3)增加运算:++ 和 --。
编译原理课程设计课程设计介绍编译原理是计算机相关专业的重要课程之一。
其主要内容涉及编译器设计以及语言处理方面的知识。
在学习该课程时,大多数学校都会要求学生完成一个编译原理课程设计。
本文将对编译原理课程设计进行介绍,并结合实例进行详细阐述。
编译原理课程设计的目的编译原理的学习主要是让学生了解和掌握编译器的工作原理,其中必不可少的一个环节就是要求学生自己编写一个简单的编译器。
课程设计的目的主要有以下几个方面:1.验证学生掌握了编译原理的相关知识。
2.帮助学生加深对编译器工作原理的理解。
3.提高学生的代码能力和问题解决能力。
4.锻炼学生的团队合作能力。
编译原理课程设计的基本流程编译原理课程设计的基本流程主要包括如下几个步骤:1.选题。
根据自己的兴趣、所学的知识和相关要求,自行选择一个编译原理课程设计题目。
2.规划设计方案。
确定设计方案以及实现过程,制定详细的开发计划,并确定团队成员。
3.进行前期调研。
通过阅读文献、查看相关工具等,了解相应技术栈以及其实现方式。
4.进行设计与实现。
按照设计方案进行开发编译器,并进行测试调整,直到达到所需的效果。
5.完成文档撰写。
详细记录设计和实现过程,进行和报告撰写。
6.项目演示。
介绍自己的编译器设计并进行演示展示。
实例演示考虑一个课程设计的实例,即编写一个基于C语言的编译器。
该编译器实现的功能是支持C语言的基本语法,包括变量、函数、流程控制等,并支持编译器错误输出。
设计与实现1.词法分析器的设计。
该部分需要使用正则表达式来识别C语言的语法结构,将其转化为具有类型和属性的单词记号。
2.语法分析器的设计。
识别出词法分析器中生成的单词记号,将其还原成原来的语法结构。
3.代码生成器的设计。
根据语法分析器还原出的语法结构生成目标代码。
4.符号表的设计。
记录变量、函数等的名称和特性,用于编译程序时的错误检查。
5.错误检查和错误输出。
检查词法分析器、语法检查器和符号表是否存在错误,对出现的错误进行输出。
编译原理课程设计报告一、分析通过设计,编制,调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。
IF 〈布尔表达式〉THEN 〈赋值语句〉ELSE 〈赋值语句〉其中(1)、可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用四元式。
(2)、写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。
(3)、编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
二、算法设计程序要求有三部分组成,即词法分析、语法分析、以及语义分析。
其中词法分析部分要求完成对输入程序的关键字、标识符、常数、运算符进行识别;并分析词法分析的结果,检查程序输入的关键字是否为符合设计文法的关键字,检查标志符是否是合法标志符,识别运算符的种类。
语法分析部分主要是以算符优先文法的设计思想和步骤完成对词法分析结果的的语法分析工作,判断输入的程序是否符合设计的IF-THEN-ELSE文法。
在语法分析通过的基础上进行语义分析,其主要任务是完成对语法分析后的程序的语义分析,根据语法制导翻译去翻译输入的程序,从而得到程序的中间代码表示形式——四元式。
词法分析、语法分析和语义分析的流程图如下:(1)词法分析A 词法分析器的功能和输出形式输入:所给文法的源程序字符串输出:二元组(单词种别,单词符号的属性值)构成的序列B. 待分析的简单语言的词法因为是模拟简单编译器, 所以就以C语言的小型子集作为模拟编译器的词法.模拟程序语言的单词符号可分为下列五种;关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于Pascal语言中的end ) 所有的关键字都是小写字母.运算符: + , - , * , / , = , < , <= , == , > , >= ,<> , && ,|| , !界符: 逗号,分号,左圆括号, 右圆括号, #常数: 在这里只涉及到int型常量其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:ID = letter(letter|digit)*NUM = digit digit *空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。