编译原理分析表及分析器的构造毕业课程设计报告.docx

上传人:b****1 文档编号:680095 上传时间:2022-10-12 格式:DOCX 页数:38 大小:33.39KB
下载 相关 举报
编译原理分析表及分析器的构造毕业课程设计报告.docx_第1页
第1页 / 共38页
编译原理分析表及分析器的构造毕业课程设计报告.docx_第2页
第2页 / 共38页
编译原理分析表及分析器的构造毕业课程设计报告.docx_第3页
第3页 / 共38页
编译原理分析表及分析器的构造毕业课程设计报告.docx_第4页
第4页 / 共38页
编译原理分析表及分析器的构造毕业课程设计报告.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

编译原理分析表及分析器的构造毕业课程设计报告.docx

《编译原理分析表及分析器的构造毕业课程设计报告.docx》由会员分享,可在线阅读,更多相关《编译原理分析表及分析器的构造毕业课程设计报告.docx(38页珍藏版)》请在冰豆网上搜索。

编译原理分析表及分析器的构造毕业课程设计报告.docx

编译原理分析表及分析器的构造毕业课程设计报告

(此文档为word格式,下载后您可任意编辑修改!

课程设计

 

LR(0)分析器自动构造程序的实现

邵贤军

 

2009年12月

合肥工业大学课程设计任务书

设计

题目

LR(0)分析表及分析器的构造

成绩

1.对任意给定的文法,完成识别文法活前缀的、的状态转化矩阵及项目集规范族的构造;

2.判断该文法是否为文法,实现分析表的构造,并输出到指定文件中;

3.实现分析器总控程序,对输入的表达式进行文法分析。

该生能按时完成课程设计任务书所规定的程序设计,综合运用所学知识独立分析和解决问题的能力。

程序设计方案。

论文论述,文理,格式。

程序运行结果。

程序验收时回答问题。

签名:

目录

第一章概述4

第二章设计的基本原理5

2.1识别文法的LR(0)项目集规范族的构造5

2.2LR(0)分析表的构造5

2.3LR(0)分析器总控程序构造6

第三章程序设计7

3.1程序总体构架7

3.2程序存储结构8

3.2.1符号表存储结构8

3.2.2产生式表存储结构8

3.2.3项目集规范族表存储结构9

3.2.4LR(0)分析表存储结构9

3.3程序算法10

3.3.1项目集规范族的构造10

3.3.2LR(0)分析表构造11

第四章程序测试12

4.1符号表测试12

4.2产生式表测试13

4.3项目集规范族表测试13

4.4LR(0)分析表测试14

4.5LR(0)分析器测试14

第五章总结和展望15

参考文献16

附录17

第一章概述

本课程设计完成了以下内容:

1.实现了对任意给定的文法,识别文法活前缀的、的状态转化矩阵及项目集规范族的构造;

2.判断该文法是否为文法,实现了分析表的构造,并输出到指定文件中;

3.实现了分析器总控程序,对输入的表达式进行文法分析。

第二章设计的基本原理

本课程设计的核心算法[1]主要有三点:

1.识别文法活前缀的、的状态转化矩阵及项目集规范族的构造;2.分析表的构造;3.分析器总控程序的构造。

2.1识别文法的LR(0)项目集规范族的构造

采用(闭包)的构造一个文法的项目规范簇。

假定是文法的任一项目集,定义和构造的闭包的算法:

(1)的任何项目都属于;

(2)若属于,那么,对任何关于的产生式,项目也属于;

(3)重复执行上述两个步骤直至不再增大。

其中初始,为对文法进行拓广构造而引进的不出现在中的非终结符。

定义状态转换函数,的第一个变元是一个项目集,第二个变元是一个文法符号。

函数值定义为。

其中={任何形如的项目|属于}

2.2LR(0)分析表的构造

假定。

令每个项目集的下标作为分析器的状态。

特别是,令那个包含项目的集合的下标为分析器的初态。

分析表的子表和子表可按如下方法构造:

(1)若项目属于且,为终结符,则置为“把移近栈”,简记为“”。

(2)若项目属于,那么对于任何终结符(或结束符#),置为“用产生式进行规约”,简记为“”(假定产生式是文法的第j个产生式)

(3)若项目属于,则置为“接受”,简记为“acc”。

(4)若,则置。

(5)分析表中凡不能用规则1~4填入信息的空白处均置上“报错标志”。

如果分析表中任何一项被重复填入,则说明分析表的入口不是唯一的,项目集中存在冲突项目,该文法不是文法。

2.3LR(0)分析器总控程序构造

分析表包括量部分,“动作”表和“状态转换”表。

规定了当状态面临输入符号时应采取什么动作。

规定了状态面对文法符号时下一状态是什么。

每一项所规定的动作不外乎是下述四种可能之一。

(1)移进把的下一状态和输入符号推进栈,下一输入符号变成现行输入符号。

(2)归约指用某一产生式进行规约。

假若的长度为,规约的动作是,去除栈顶的个项,使状态变成栈顶状态,然后把的下一状态推进栈。

规约动作不改变现行输入符号。

规约动作不改变现行输入符号。

(3)接受宣布分析成功,停止分析器工作

(4)报错发现源程序含有错误,调用出错处理程序。

第三章程序设计

3.1程序总体构架

本课程设计开发的程序主要由4张表组成,分别为:

符号表、产生式表、表和项目集规范簇表。

同时,项目集规范簇表包含一个分析栈作为分析器总控程序。

产生式表包含符号表作为子表,项目集规范簇表包含产生式表、表作为子表。

程序工作流程:

1.读取含有文法规则的文件,为该文法中的每一个不同的文法符号(终结符和非终结符分配一个编号),记录文法符号的属性(终结符非终结符),存储于一张符号表中;

2.再次读取文件,将产生式存储于产生式表中;

3.根据产生式构建项目集规范族,存储于表中;

4.根据构建的项目集规范族构建分析表,填写分析表同时检查该文法是否为文法;

5.对于输入的表达式,分析器根据构建的分析表进行文法分析,给出分析结果。

3.2程序存储结构

3.2.1符号表存储结构

动态数组下标,同时作为符号的编号

标识符

是否为非终结符

3.2.2产生式表存储结构

产生式标号

非终结符标号(与中的一致)

指示当前非终结符的产生式

当前非终结符产生式的长度,用于帮助区分一个产生式的不同项目,即项目个数等于

指示下一个非终结符

一个产生式中的标识符名(与中的一致)

一个产生式中的下一个标识符

3.2.3项目集规范族表存储结构

1)定义二元组:

产生式标号,与中的一致

一个产生式的第个项目,可由中的帮助确定

如:

产生式:

2)结构:

当前状态编号

指示下一状态

指示闭包中的项目

闭包中的项目名

当前项目的产生的新状态的编号,即状态转移的目的地状态编号

闭包中的下一个项目

待构造的项目的闭包的

待构造的项目的闭包

待构造状态的

待构造状态的项目

3.2.4LR(0)分析表存储结构

 

指示表头的孩子结点

指示表头的后继结点

指示该表项的操作

指示该表项的操作数

指示该表项是否被填写过,用于判断文法是否为文法

3.3程序算法

3.3.1项目集规范族的构造

1.(初始化)将初始条件作为该状态头结点的第一个孩子结点,并构造该孩子结点的闭包,连接其后,指向第一个状态头结点,指向第一个状态头结点的第一个孩子结点;

2.查看,若为空,停止;若不为空,转3;

3.查看,若为空,转4;若不为空,构造的,检查该状态与之前构造的状态有无重复,若重复,则停止构造,的填写重复的已存在的状态的编号;若不重复,则作为一个新状态,连接于,并构造其闭包连接其后,指向。

转2;

4.指向下一状态,若下一状态为空,则结束,否则,指向下一状态头结点的第一个孩子结点,转3。

具体细节:

设所指项目为,因为要对其构造闭包,该项目一定不是终态,所以区分项目的圆点符号位于第个标识符的左侧。

现在构造的闭包,分两个步骤实现:

1.构造的:

查看中编号为的产生式,取得该产生式的长度属性

1)若,则停止构造当前闭包(已是终态),此时的项填;

2)否则,将作为该闭包的第一个项目,此时的项填该新状态的状态编号。

2.构造该孩子结点的闭包:

查看中编号为的产生式的第个标识符,取得该标识符的,查看中该标识符的类别属性

3)若为1(非终结符),则查看非终结符的所有产生式,记这些产生式的编号为,将所有的加入闭包

4)否则,结束

3.检查该状态与之前构造的状态有无重复:

断言:

任意两个状态,只要不同,则即为不同状态。

3.3.2LR(0)分析表构造

对于编号为的状态,现依据其项目填写分析表:

1.如果该项目形如,查看该项目的属性,

1)若为终结符,则在表的状态对应行,对应列,填写,表示将把移进栈

2)若为非终结符,则在表的状态对应行,对应列,填写,表示状态转移至状态

2.如果该项目形如

1)若为起始符号,则置在表的状态对应行,对应列,填写,表示接受。

2)否则,对任何终结符或结束符,则在表的状态对应行,对应列,填写,表示用产生式进行规约。

第四章程序测试

以文法G为例:

程序模块输入:

含上述文法的文件,下面展示个模块的输出结果

4.1符号表测试

输出结果为<符号编号,符号,是否为终结符>

与预期结果相同

4.2产生式表测试

输出结果与读入的文件中的产生式相同,且产生式中符号的编号正确

4.3项目集规范族表测试

输出结果为<状态编号>:

<产生式编号,产生式项目编号,项目转移的目标状态>

与预期结果相同

4.4LR(0)分析表测试

输出结果为分析表,与预期结果相同

4.5LR(0)分析器测试

以输入字符串和为例

表达式的分析结果正确

第五章总结和展望

完成了编译原理课程设计之后,我感到十分的疲惫,但是那一份富有成就感的欣喜却胜过了那十分的疲惫。

由于本次选题匆忙,选了一道比较有难度的题目,在做课程设计的过程中,我翻阅了很多相关资料,对课本中点到即止的知识进行了更加深入的学习,有了更加深入的理解。

做课程设计的过程是痛苦的,我在这一个星期内多次熬夜战斗,有时甚至顾不上吃饭,只为了揪出程序中的错误,只为了精益求精的完成这个课程设计。

就在我写这份总结的时候,我发现自己我一点也不累了,反而很兴奋,很有成就感。

通过本次课程设计,我发现实践是检验学习深度、学习成果的唯一途径,课本上的知识点都是浓缩的精华,在理论阐述上不可能做到面面俱到,学到的知识当然也不可能直接运用到实际情况上。

在实践的过程中,我们需要将我们学习到的知识进行一定程度的扩充,本次课程设计涉及到算法,LR分析器自动构造程序的机制原理以及C++语言。

在用C++语言实现本次课程设计的过程中,我更加熟悉了C++语言的语法机制,语言规范;在实现LR分析器自动构造程序的过程中,我更加熟悉了其构造程序的原理以及与之相关的算法。

由于时间匆忙,我完成的课程设计还有很多不足之处,很多工作还可以继续完善,在提交作业之后,我不会把它放在那里一看不看的,我会继续完善它,让它更加人性化,具有可操作性,比如做个可视化的界面出来,丰富它的功能,相信以后的工作将更加多彩丰富,更加有成就感!

参考文献

[1]陈火旺,刘春林,谭庆平,赵克佳,刘越程序设计语言编译原理国防工业出版社2006

[2]谭浩强C++程序设计清华大学出版社2007

附录

说明:

本附录中包含了本次课程设计的所有代码

Closure_List.;

Closure_Child_Node*Next_Item;

};

structClosure_Parent_Node

{

intCurrent_State;

Closure_Parent_Node*Next_State;

Closure_Child_Node*Item;

};

classClosure_List

{

private:

Closure_Parent_Node*Closure_List__List._Name;

Formula_List_ChildItem*Next_Sign;

};

structFormula_List_ParentItem

{

intFormula_Num;

intVn_Name;

intFormula_Length

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

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1