(重庆理工大学计算机学院)编译原理课程设计报告
编译原理课程设计报告

《编译原理》课程设计报告一、课程设计目的通过课程设计进一步理解高级语言在计算机中的执行过程,了解现代编译器的运作机制,加深对编译原理中重点算法和编译技术的理解,提高自己自学和理解的能力。
学会如何利用已有软件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所示。
编译原理课程设计报告

2011-2012学年第二学期《编译原理》课程设计报告学院:计算机科学与工程学院班级:学生姓名:学号:成绩:指导教师:时间:2012年5 月目录一、课程设计的目的 ---------------------------------------------------------------- - 1 -二、课堂实验及课程设计的内容 -------------------------------------------------- - 1 -2.1、课堂实验内容-------------------------------------------------------------- - 1 -2.2、课程设计内容-------------------------------------------------------------- - 1 -三、visual studio 2008 简介------------------------------------------------------- - 2 -四、问题分析及相关原理介绍 ----------------------------------------------------- - 3 -4.1、实验部分问题分析及相关原理介绍 ---------------------------------- - 3 -4.1.1、词法分析功能介绍及分析------------------------------------- - 3 -4.1.2、语法分析功能介绍及分析------------------------------------- - 3 -4.1.3、语义分析功能介绍及分析------------------------------------- - 4 -4.2、课程设计部分问题分析及相关原理介绍 ---------------------------- - 5 -4.2.1、编译程序介绍 ----------------------------------------------------- - 5 -4.2.2、对所写编译程序的源语言的描述(C语言) -------------- - 6 -4.2.3、各部分的功能介绍及分析 -------------------------------------- - 7 -4.3、关键算法:单词的识别-------------------------------------------------- - 8 -4.3.1、算法思想介绍 ----------------------------------------------------- - 8 -4.3.2、算法功能及分析 -------------------------------------------------- - 8 -五、设计思路及关键问题的解决方法 ------------------------------------------ - 10 -5.1、编译系统------------------------------------------------------------------ - 10 -5.1.1、设计思路 --------------------------------------------------------- - 10 -5.2、词法分析器总控算法--------------------------------------------------- - 12 -5.2.1、设计思路 --------------------------------------------------------- - 12 -5.2.2、关键问题及其解决方法 --------------------------------------- - 13 -六、结果及测试分析-------------------------------------------------------------- - 14 -6.1、软件运行环境及限制--------------------------------------------------- - 14 -6.2、测试数据说明------------------------------------------------------------ - 14 -6.3、运行结果及功能说明--------------------------------------------------- - 16 -6.4、测试及分析说明--------------------------------------------------------- - 16 -七、总结及心得体会 --------------------------------------------------------------- - 17 -7.1、设计过程------------------------------------------------------------------ - 17 -7.2、困难与收获 ------------------------------------------------------------- - 17 -八、参考文献 ------------------------------------------------------------------------ - 18 -一、课程设计的目的通过设计、编写和调试词法分析程序(又称扫描器),了解扫描器的组成结构,不同种类单词的识别方法,加深了对词法分析作用的理解。
编译原理课程设计报告C语言词法与语法分析器的实现

编译原理课程设计报告课题名称:编译原理课程设计C-语言词法与语法分析器的实现提交文档学生姓名:提交文档学生学号:同组成员名单:指导教师姓名:指导教师评阅成绩:指导教师评阅意见:..提交报告时间:年月日C-词法与语法分析器的实现1.课程设计目标(1)题目实用性C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。
通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。
(2)C-语言的词法说明①语言的关键字:else if int return void while所有的关键字都是保留字,并且必须是小写。
②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */③其他标记是ID和NUM,通过下列正则表达式定义:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。
小写和大写字母是有区别的。
④空格由空白、换行符和制表符组成。
空格通常被忽略。
⑤注释用通常的c语言符号/ * . . . * /围起来。
注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。
注释不能嵌套。
(3)程序设计目标能够对一个程序正确的进行词法及语法分析。
2.分析与设计(1)设计思想a.词法分析词法分析的实现主要利用有穷自动机理论。
有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。
通过有穷自动机理论能够容易的设计出词法分析器。
b.语法分析语法分析采用递归下降分析。
递归下降法是语法分析中最易懂的一种方法。
它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。
编译原理课程设计报告报告

编译原理课程设计报告一、目的与要求目的:在分析理解一个教学型编译程序(如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]; /* 名字表*/②运行时存储组织和管理由于编译时目标程序运行的数据空间大小已经规定,所以存储组织属于静态存储。
重庆理工大学实践教学大纲(实习设计)08 编译原理 课程设计大纲 ok

《编译原理》课程设计大纲开课单位:计算机科学与工程学院开课学期:第3学年春季学期学分:1学分学时:16学时(1周)适用专业:计算机科学与技术(0307)一、课程设计的目的与意义本课程设计是配合《编译原理》课程而开设的一门实践课程。
针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,同时强调好的程序设计风格。
二、课程设计的内容1、课程设计题目分成3类,设计题目如下自动编译器设计题目:(1)中间代码生成器;(2)自动生成工具FLEX 和YACC。
面向对象的编译器模拟设计题目:(1)面向对象的词法编译器设计;(2)面向对象的中间代码编译器设计;(3)面向对象的目标代码编译器设计。
编译原理算法模拟设计题目:(1)限自动机的生成及化简过程模拟;(2)First集和Follow集生成算法模拟;(3)LL(1)分析过程模拟;(4)FirstVT集和LastVT集生成算法模拟;(5)算符优先分析表生成模拟;(6)算符优先分析过程模拟;(7)LR分析过程模拟。
2、学生从这3类题目中选择完成部分题目。
三、课程设计的方式1、学生在实验室、计算机房、教室相对集中进行课程设计,教师指导,学生独立完成。
2、第一天由老师讲解,后面三天学生在教师的指导下独立工作,最后一天答辩,提交资料。
四、课程设计的基本要求1、实训教学课堂化,严格考勤制度,在课程设计期间累计旷课达到一定学时,取消考核资格。
2、学生因特殊原因请假须履行手续,凡未请假或未获批准擅自离岗者,均按旷课处理。
3、课程设计需要提交如下资料:(1)文档;(2)软件:需提供加注释的源程序,并能正常运行;(3)设计心得:记录程序设计的思路、实现程序的步骤、遇到的问题及其解决方法等内容。
对于分析设计中未能实现的部分需要加以说明。
对于软件中所参考的部分模块或代码需要加以声明,并说明出处。
五、课程设计成绩的评定1、按优、良、中、及格、不及格五个等级评定成绩。
编译原理课程设计报告

编译原理课程设计报告一、分析通过设计,编制,调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。
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,运算符,界符和关键字,词法分析阶段通常会被过滤掉。
(重庆理工大学计算机学院)编译原理课程设计报告

编译原理课程设计报告实验名称编译原理课程设计班级学号姓名指导教师实验成绩2013 年06月一、实验目的➢通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。
➢通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。
二、实验内容➢正规式——>NFA——>DFA——>MFA1.正规式转化为不确定的有穷自动机(1)目的与要求通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。
(2)问题描述任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。
(3)算法描述对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。
步骤1:首先构造基本符号的有穷自动机。
步骤2:其次构造连接、或和闭包运算的有穷自动机。
(4)基本要求算法实现的基本要求是:(1) 输入一个正规式r;(2) 输出与正规式r等价的NFA。
(5)测试数据输入正规式:(a|b)*(aa|bb)(a|b)*得到与之等价的NFA N(6)输出结果2.不确定的有穷自动机的确定化(1)目的与要求通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。
DFA的表现形式可以是表格或图形。
(2)问题描述任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。
(3)算法描述用子集法将NFA转换成接受同样语言的DFA。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理课程设计报告实验名称编译原理课程设计班级学号姓名指导教师实验成绩2013 年06月一、实验目的➢通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。
➢通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。
二、实验内容➢正规式——>NFA——>DFA——>MFA1.正规式转化为不确定的有穷自动机(1)目的与要求通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。
(2)问题描述任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。
(3)算法描述对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。
步骤1:首先构造基本符号的有穷自动机。
步骤2:其次构造连接、或和闭包运算的有穷自动机。
(4)基本要求算法实现的基本要求是:(1) 输入一个正规式r;(2) 输出与正规式r等价的NFA。
(5)测试数据输入正规式:(a|b)*(aa|bb)(a|b)*得到与之等价的NFA N(6)输出结果2.不确定的有穷自动机的确定化(1)目的与要求通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。
DFA的表现形式可以是表格或图形。
(2)问题描述任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。
(3)算法描述用子集法将NFA转换成接受同样语言的DFA。
步骤一:对状态图进行改造(1) 增加状态X,Y,使之成为新的唯一的初态和终态。
从X引ε弧到原初态结点, 从原终态结点引ε弧到Y结点。
(2) 对状态图进一步进行如下形式的改变步骤2:对NFA 进行确定化,构造状态转换表。
(1)初始时,ε_closure(s0)是Dstates中唯一的状态且未被标记;while Dstates中存在一个未标记的状态T do begin标记T;for每个输入符号a do beginU:= ε_closure(move(T,a));if U没在Dstates中then将U作为一个未标记的状态添加到Dstates中;end;end;(2) ε_closure的计算,计算ε_closure(T)的简单算法是用栈来保存其弧还没有完成ε转换检查的状态。
将T中所有的状态压入栈stack中:将ε_closure(T)初始化为T;while栈stack不空do begin将栈顶元素t弹出栈;for每个这样的状态u:从t到u有一条标记为ε的边doif u不在ε_closure(T)中do begin将u添加到ε_closure(T);将u压入栈stack中;end;end;(4)基本要求算法实现的基本要求是:(1) 输入一个NFA N;(2) 输出与之等价的DFA。
(5)测试数据给定不确定的有穷自动机:得到与之等价的确定的有穷自动机:(6)输出效果输出状态转换表表示的确定的有穷自动机如下:3.确定的有穷自动机的化简(1)目的与要求通过设计、编写和调试将确定的有穷自动机的状态数变为最少的程序,使学生掌握化简有穷自动机的过程中的相关概念和方法。
DFA的表现形式可以是表格或图形。
(2)问题描述每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(因状态名不同的同构情况除外)。
任意给定一个确定的有穷自动机,根据算法设计一个程序,将该DFA化简为与之等价的最简DFA。
(3)算法描述1.构造具有两个组的状态集合的初始划分Π:接受状态组F,非接受状态组S-F。
2.对Π采用下面所述的过程来构造新的划分Πnew。
forΠ中每个组G dobegin当且仅当对任意输入符号a,状态s和t读入a后转换到Π的同一组中;/*最坏情况下,一个状态就可能成为一个组*/用所有新形成的小组集代替Πnew中的G;end3.如果Πnew=Π,令Πfinal=Π,再执行步骤4;否则,令Π:=Πnew,重复步骤2。
4.在划分Πfinal的每个状态组中选一个状态作为该组的代表。
这些代表构成了简化后的DFA M'的状态。
另s是一个代表状态,而且假设:在DFA M中,在输入a上有从s到t的转换。
令t所在组的代表是r(r可能就是t),那么在M'中有一个从s到r的a上的转换。
令包含s0的状态组的代表是M'的开始状态,并令M'的接受状态是那些属于F的状态所在组的代表。
注意,Πfinal的每个组或者仅含F中的状态,或者不含F中的状态。
5.如果M'含有死状态(即一个对所有输入符号都有到自身的转换的非接受状态d),则从M'中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。
(4)基本要求算法实现的基本要求是:(1) 输入一个DFA D;(2) 输出与之等价的最小化的DFA M。
(5)测试数据给定确定的有穷自动机:得到最小化的确定的有穷自动机:(6)输出效果➢LR(0)算法分析1.构造LR(0)项目集规范簇(1)问题描述给定一个LR(0)文法,求出其项目集规范簇,结果以图形或表格的形式输出。
(2)算法描述设有LR(0)文法G,首先求出其所有的项目,然后根据项目求出其LR(0)项目集规范簇,求项目PROCEDURE itemsets(G');BEGINC := { CLOSURE( {S' ·S} ) };REPEATfor C中的每个项目集I和每个文法符号X doif GO(I,X)非空且不属于C THEN把GO(I,X) 加入C中UNTIL C 不再增大;END;(3)测试数据输入如下所示的文法:E →aA|bBA →cA|dB →cB|d项目集合为:1. S' →·E2. S' →E ·3. E →.aA4. E →a·A5. E →aA·6. A →· cA7. A →c · A8. A →cA ·9. A →·d 10. A → d·11. E →.bB 12. E → b·B 13. E → bB·14. B →.cB 15. B →c·B 16. B →cB ·17. B →.d 18. B → d·(4)结果输出根据算法得到的项目集规范簇如下图所示:结果也可以用表格的形式表示如下:状态项目集后继符号后继状态S0{ S' →·EE→·aAE→·bB }EabS1S2S3S1{ S' →E · }#接受态2.构造LR(0)分析表(1)问题描述给定一个LR(0)文法,利用6.1得到的项目集规范簇,求出其LR(0)分析表,并以表格的形式输出。
(2)算法描述LR(0)(3)基本要求动态模拟算法的基本功能是:(1)输入LR分析文法,要求可以直接输入,也可以读入文件;(2)输出项目集规范簇(可选);(3)输出LR(0)分析表;(4)测试数据输入文法:E →aA|bBA →cA|dB →cB|d输出LR分析表如下:3.LR分析过程的实现(1)问题描述给定一个LR(0)文法,利用6.2求出其LR(0)分析表;或者给定某个LR分析表(可能不是LR(0)分析表,其分析过程类似),输入一个符号串,依据LR分析表输出与句子对应的语法树,能对语法树生成过程进行模拟。
(2)算法描述在分析过程中设置一个堆栈和一个分析表,根据分析表和输入符号串对堆栈进行操作,分析器的下一步动作是由栈顶状态Sm和当前面临的输入符号ai唯一确定的。
根据栈顶状态Sm和输入符号ai查action表, 根据表中的内容不同完成不同的动作,若action[Sm, ai]为:•移进:当前输入符号ai进符号栈,下一输入符号变成当前输入符号,将action表中指出的状态S进状态栈。
三元式变为:(S0S1…SmS, # X1X2…Xmai, ai+1…an#)•归约:按某个产生式A→β进行归约,若产生式的右端长度为r,则两个栈顶的r个元素同时出栈。
将归约后的符号A进符号栈; 根据新栈顶状态Sm-r和归约符号A查GOTO表,S=goto[Sm-r, A]进状态栈。
三元式变为:(S0S1 … Sm-r S, # X1X2…Xm-rA, aiai+1…an #)•接受:分析成功,终止分析。
三元式不再变化。
•出错:报告出错信息。
三元式的变化过程终止。
(3)基本要求动态模拟算法的基本功能是:(1). 输入LR分析表和一个句子;(2). 输出LR总控程序;(3). 输出依据句子构对应的语法树的过程;(4)测试数据输入句子:i*i+i输入文法:(1) E →E+T(2) E →T(3) T →T*F(4) T →F(5) F→(F)(6) F →i和如下所示的LR分析表:得到如下图所示的LR分析过程:三、实验方案设计➢正规式——>NFA——>DFA——>MFA1.优先符关系表的定义//行分别表示:'.','|','(',')','*','#'//列分别表示:'.','|','(',')','*','#'char[,] relation = {{'>','>','<','>','<','>'},{'<','>','<','>','<','>'},{'<','<','<','=','<','E'},{'>','>','E','>','>','>'},{'>','>','E','>','>','>'},{'<','<','<','E','<','='}};2.栈定义///<summary>/// NFA状态栈///</summary>struct StatusStack{public int start;public int end;}StatusStack[] stack_ZT = new StatusStack[100];///<summary>/// DFA化简状态集合结构///</summary>struct Tstates{public int[] data;//NFA的状态集public int length;//个数从零开始统计public bool mark;public int status;//计数状态public int accept;//标记开始状态(-1)或结尾状态(1) }Tstates[] Tstateslt = new Tstates[100];///<summary>/// MFA状态集///</summary>struct Mstates{public int[] data;public int length;public int status;//计数状态}Mstates[] Mstateslt = new Mstates[100];➢LR(0)算法分析1.构造LR(0)项目集规范簇(1)定义变量string nonterminal = ""; //保存非终结符string terminal = ""; //保存终结符string[] grammer = null; //保存文法List<itemsetsNode> itemsets = null; //项目集规范簇struct itemsetsNode//项目集{public string no;public List<ItemNode> itemsetsNodeValue;}class ItemNode{string item; //活前缀string nextSymbol; //后继符号string nextStatus; //后继状态}(2)函数实现char[] separator = { '\r', '\n' };grammer = this.txtgrammer.Text.Split(separator, StringSplitOptions.RemoveEmptyEntries); //分割文法符号串foreach (string tempStr2 in grammer){if (nonterminal.Contains(tempStr2[0]) == false)nonterminal += tempStr2[0];}itemsets = new List<itemsetsNode>(); //实例化存放项目集节点的链表itemsetsNode tempItemSetNode = new itemsetsNode();tempItemSetNode.no = "0";string tempStr = grammer[0];tempStr = tempStr.Insert(tempStr.IndexOf('>') + 1, "."); tempItemSetNode.itemsetsNodeValue = Item_Closure(tempStr); itemsets.Add(tempItemSetNode);int k = 0;while (k < itemsets.Count){foreach(ItemNode tempItemNode in itemsets[k].itemsetsNodeValue){//对每个项目进行处理List<ItemNode> tempItemsetsNode = null;//若不是是接受态或可规约项,使str中的.向后移一位string str = tempItemNode.Item;int index = str.IndexOf('.');if (index == str.Length - 1) //是接受态或可规约项{tempItemNode.NextSymbol = "#";if (str[0] == nonterminal[0])tempItemNode.NextStatus = "接受态";elsetempItemNode.NextStatus = "规约";continue;}str = str.Remove(index, 1);tempItemNode.NextSymbol = str[index].ToString();if(nonterminal.Contains(tempItemNode.NextSymbol)== false) //不是非终结符{if(terminal.Contains(tempItemNode.NextSymbol) == false)terminal += tempItemNode.NextSymbol;}str = str.Insert(index + 1, ".");tempItemsetsNode = Item_Closure(str); //求项目item 的Closureint row = Find(itemsets, tempItemsetsNode); //查找是否已存在该项目集if (row == -1) //不存在该项目集{tempItemSetNode = new itemsetsNode();tempItemNode.NextStatus = tempItemSetNode.no = itemsets.Count.ToString();tempItemSetNode.itemsetsNodeValue = tempItemsetsNode;itemsets.Add(tempItemSetNode);}else{tempItemNode.NextStatus = row.ToString();}}k++;}display(); //将结果显示在listview中2.构造LR(0)分析表(1)定义变量List<ActionNode> actionList = null; //存放action表的内容List<GotoNode> gotoList = null; //存放goto表的内容(2)函数实现actionList = new List<ActionNode>();gotoList = new List<GotoNode>();erminal += "#";//遍历项目集规范簇foreach (itemsetsNode tempItemSetsNode in itemsets){foreach (ItemNode tempItemNode intempItemSetsNode.itemsetsNodeValue){if (tempItemNode.NextSymbol != "#" &&nonterminal.Contains(tempItemNode.NextSymbol) == true){//后继符号是非终结符号,则想goto表添加内容GotoNode goTo = new GotoNode();goTo.Num = int.Parse(tempItemSetsNode.no);goTo.GoToSymbol = tempItemNode.NextSymbol;goTo.Value = int.Parse(tempItemNode.NextStatus);gotoList.Add(goTo);}else{//后继符号是终结符号,则想antion表添加内容if (tempItemNode.NextSymbol == "#"){if (tempItemNode.Item[0].ToString() == nonterminal[0].ToString()) //表示产生式左边是开始符号{ActionNode action = new ActionNode();action.Num = int.Parse(tempItemSetsNode.no);action.Symbol = tempItemNode.NextSymbol; action.Value = "acc";actionList.Add(action);}else{int k;for (k = 0; k < grammer.Length; k++){string str = tempItemNode.Item;str = str.Remove(tempItemNode.Item.Length - 1);if (grammer[k].Equals(str) == true) {k++;break;}}foreach (char ch in terminal){ActionNode action = new ActionNode(); action.Num = int.Parse(tempItemSetsNode.no);action.Symbol = ch.ToString();action.Value = "r" + k.ToString(); actionList.Add(action);}}}else{ActionNode action = new ActionNode();action.Num = int.Parse(tempItemSetsNode.no);action.Symbol = tempItemNode.NextSymbol;action.Value = "s" + tempItemNode.NextStatus;actionList.Add(action);}}}}DisplayLrTable(this.listView2);3.LR分析过程的实现(1)变量定义int stepCount = 0;Stack<int> statusStack = null; //状态栈Stack<string> symbolStack = null; //符号栈四、实验测试➢正规式——>NFA——>DFA——>MFA(1)输入一个表达式,将表达式转换为NFA(2)将NFA转换为DFA(3)将生成的DFA进行确定化,生成MFA➢LR(0)算法分析(1)从文件读入LR(0)文法后构造LR(0)项目集规范簇(2)构造LR(0)分析表(3)输入分析串,进行LR分析五、程序的使用手册➢正规式——>NFA——>DFA——>MFA现在文本框中输入一个表达式,点击“确定”,之后依次点击“NFA”按钮将表达式转换为NFA;点击“DFA”按钮,将生成的NFA转换为DFA;点击“MFA”按钮,将生成的DFA进行简化。