重庆理工大学计算机学院编译原理课程设计报告.docx
- 文档编号:9153402
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:26
- 大小:806.45KB
重庆理工大学计算机学院编译原理课程设计报告.docx
《重庆理工大学计算机学院编译原理课程设计报告.docx》由会员分享,可在线阅读,更多相关《重庆理工大学计算机学院编译原理课程设计报告.docx(26页珍藏版)》请在冰豆网上搜索。
重庆理工大学计算机学院编译原理课程设计报告
编译原理课程设计报告
实验名称编译原理课程设计
班级
学号
姓名
指导教师
实验成绩
2013年06月
1、实验目的
Ø通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。
Ø通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。
2、实验内容
Ø正规式——>NFA——>DFA——>MFA
1.正规式转化为不确定的有穷自动机
(1)目的与要求
通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。
(2)问题描述
任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFAN。
(3)算法描述
对于Σ上的每个正规式R,可以构造一个Σ上的NFAM,使得L(M)=L(R)。
步骤1:
首先构造基本符号的有穷自动机。
步骤2:
其次构造连接、或和闭包运算的有穷自动机。
(4)基本要求
算法实现的基本要求是:
(1)输入一个正规式r;
(2)输出与正规式r等价的NFA。
(5)测试数据
输入正规式:
(a|b)*(aa|bb)(a|b)*
得到与之等价的NFAN
(6)输出结果
2.不确定的有穷自动机的确定化
(1)目的与要求
通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。
DFA的表现形式可以是表格或图形。
(2)问题描述
任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFAN变换为与之等价的DFAD。
(3)算法描述
用子集法将NFA转换成接受同样语言的DFA。
步骤一:
对状态图进行改造
(1)增加状态X,Y,使之成为新的唯一的初态和终态。
从X引ε弧到原初态结点,从原终态结点引ε弧到Y结点。
(2)对状态图进一步进行如下形式的改变
步骤2:
对NFA进行确定化,构造状态转换表。
(1)子集构造法:
初始时,ε_closure(s0)是Dstates中唯一的状态且未被标记;
whileDstates中存在一个未标记的状态Tdobegin
标记T;
for每个输入符号adobegin
U:
=ε_closure(move(T,a));
ifU没在Dstates中then
将U作为一个未标记的状态添加到Dstates中;
end;
end;
(2)ε_closure的计算,计算ε_closure(T)的简单算法是用栈来保存其弧还没有完成ε转换检查的状态。
将T中所有的状态压入栈stack中:
将ε_closure(T)初始化为T;
while栈stack不空dobegin
将栈顶元素t弹出栈;
for每个这样的状态u:
从t到u有一条标记为ε的边do
ifu不在ε_closure(T)中dobegin
将u添加到ε_closure(T);
将u压入栈stack中;
end;
end;
(4)基本要求
算法实现的基本要求是:
(1)输入一个NFAN;
(2)输出与之等价的DFA。
(5)测试数据
给定不确定的有穷自动机:
得到与之等价的确定的有穷自动机:
(6)输出效果
输出状态转换表表示的确定的有穷自动机如下:
3.确定的有穷自动机的化简
(1)目的与要求
通过设计、编写和调试将确定的有穷自动机的状态数变为最少的程序,使学生掌握化简有穷自动机的过程中的相关概念和方法。
DFA的表现形式可以是表格或图形。
(2)问题描述
每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(因状态名不同的同构情况除外)。
任意给定一个确定的有穷自动机,根据算法设计一个程序,将该DFA化简为与之等价的最简DFA。
(3)算法描述
1.构造具有两个组的状态集合的初始划分Π:
接受状态组F,非接受状态组S-F。
2.对Π采用下面所述的过程来构造新的划分Πnew。
forΠ中每个组Gdo
begin
当且仅当对任意输入符号a,状态s和t读入a后转换到Π的同一组中;
/*最坏情况下,一个状态就可能成为一个组*/
用所有新形成的小组集代替Πnew中的G;
end
3.如果Πnew=Π,令Πfinal=Π,再执行步骤4;否则,令Π:
=Πnew,重复步骤2。
4.在划分Πfinal的每个状态组中选一个状态作为该组的代表。
这些代表构成了简化后的DFAM'的状态。
另s是一个代表状态,而且假设:
在DFAM中,在输入a上有从s到t的转换。
令t所在组的代表是r(r可能就是t),那么在M'中有一个从s到r的a上的转换。
令包含s0的状态组的代表是M'的开始状态,并令M'的接受状态是那些属于F的状态所在组的代表。
注意,Πfinal的每个组或者仅含F中的状态,或者不含F中的状态。
5.如果M'含有死状态(即一个对所有输入符号都有到自身的转换的非接受状态d),则从M'中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。
(4)基本要求
算法实现的基本要求是:
(1)输入一个DFAD;
(2)输出与之等价的最小化的DFAM。
(5)测试数据
给定确定的有穷自动机:
得到最小化的确定的有穷自动机:
(6)输出效果
ØLR(0)算法分析
1.构造LR(0)项目集规范簇
(1)问题描述
给定一个LR(0)文法,求出其项目集规范簇,结果以图形或表格的形式输出。
(2)算法描述
设有LR(0)文法G,首先求出其所有的项目,然后根据项目求出其LR(0)项目集规范簇,求项目集规范簇的算法为:
PROCEDUREitemsets(G');
BEGIN
C:
={CLOSURE({S'◊·S})};
REPEAT
forC中的每个项目集I和每个文法符号Xdo
ifGO(I,X)非空且不属于CTHEN
把GO(I,X)加入C中
UNTILC不再增大;
END;
(3)测试数据
输入如下所示的文法:
E→aA|bB
A→cA|d
B→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→·d10.A→d·
11.E→.bB12.E→b·B13.E→bB·
14.B→.cB15.B→c·B16.B→cB·
17.B→.d18.B→d·
(4)结果输出
根据算法得到的项目集规范簇如下图所示:
结果也可以用表格的形式表示如下:
状态
项目集
后继符号
后继状态
S0
{S'→·E
E→·aA
E→·bB}
E
a
b
S1
S2
S3
S1
{S'→E·}
#
接受态
S2
{E→a·A
A→·cA
A→·d}
A
c
d
S6
S4
S10
S3
{E→b·B
B→·cB
B→·d}
B
c
d
S7
S5
S11
S4
{A→c·A
A→·cA
A→·d}
A
c
d
S8
S4
S10
S5
{B→c·B
B→·cB
B→·d}
B
c
d
S9
S5
S11
S6
{E→aA·}
#
归约
S7
{E→bB·}
#
归约
S8
{A→cA·}
#
归约
S9
{B→cB·}
#
归约
S10
{A→d·}
#
归约
S11
{B→d·}
#
归约
2.构造LR(0)分析表
(1)问题描述
给定一个LR(0)文法,利用6.1得到的项目集规范簇,求出其LR(0)分析表,并以表格的形式输出。
(2)算法描述
LR(0)分析表的构造算法为:
●对于A→α·X∈βIk,GO(Ik,X)=Ij
Ø若X∈Vt,则置action[k,X]=Sj,即把(j,a)移进栈
Ø若X∈Vn,则置goto[Ik,X]=j
●对于A→α·∈Ik,则对所有的x∈Vt和#,均置action[k,x]=rj(设A→α是第j个产生式),即用A→α归约)
●若S'→S·∈Ik,则置action[k,#]=acc,即接受
●其他均置出错。
(3)基本要求
动态模拟算法的基本功能是:
(1)输入LR分析文法,要求可以直接输入,也可以读入文件;
(2)输出项目集规范簇(可选);
(3)输出LR(0)分析表;
(4)测试数据
输入文法:
E→aA|bB
A→cA|d
B→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-rS,#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分析过程:
3、实验方案设计
Ø正规式——>NFA——>DFA——>MFA
1.优先符关系表的定义
//行分别表示:
'.','|','(',')','*','#'
//列分别表示:
'.','|','(',')','*','#'
char[,]relation={{'>','>','<','>','<','>'},{'<','>','<','>','<','>'},{'<','<','<','=','<','E'},
{'>','>','E','>','>','>'},
{'>','>','E','>','>','>'},
{'<','<','<','E','<','='}};
2.栈定义
///
///NFA状态栈
///
structStatusStack
{
publicintstart;
publicintend;
}
StatusStack[]stack_ZT=newStatusStack[100];
///
///DFA化简状态集合结构
///
structTstates
{
publicint[]data;//NFA的状态集
publicintlength;//个数从零开始统计
publicboolmark;
publicintstatus;//计数状态
publicintaccept;//标记开始状态(-1)或结尾状态
(1)
}
Tstates[]Tstateslt=newTstates[100];
///
///MFA状态集
///
structMstates
{
publicint[]data;
publicintlength;
publicintstatus;//计数状态
}
Mstates[]Mstateslt=newMstates[100];
ØLR(0)算法分析
1.构造LR(0)项目集规范簇
(1)定义变量
stringnonterminal="";//保存非终结符
stringterminal="";//保存终结符
string[]grammer=null;//保存文法
List
structitemsetsNode//项目集
{
publicstringno;
publicList
}
classItemNode
{
stringitem;//活前缀
stringnextSymbol;//后继符号
stringnextStatus;//后继状态
}
(2)函数实现
char[]separator={'\r','\n'};
grammer=this.txtgrammer.Text.Split(separator,StringSplitOptions.RemoveEmptyEntries);//分割文法符号串
foreach(stringtempStr2ingrammer)
{
if(nonterminal.Contains(tempStr2[0])==false)
nonterminal+=tempStr2[0];
}
itemsets=newList
itemsetsNodetempItemSetNode=newitemsetsNode();
tempItemSetNode.no="0";
stringtempStr=grammer[0];
tempStr=tempStr.Insert(tempStr.IndexOf('>')+1,".");
tempItemSetNode.itemsetsNodeValue=Item_Closure(tempStr);
itemsets.Add(tempItemSetNode);
intk=0;
while(k { foreach(ItemNodetempItemNodeinitemsets[k].itemsetsNodeValue) { //对每个项目进行处理List //若不是是接受态或可规约项,使str中的.向后移一位 stringstr=tempItemNode.Item; intindex=str.IndexOf('.'); if(index==str.Length-1)//是接受态或可规约项{ tempItemNode.NextSymbol="#"; if(str[0]==nonterminal[0]) tempItemNode.NextStatus="接受态"; else tempItemNode.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的Closure introw=Find(itemsets,tempItemsetsNode);//查找是否已存在该项目集 if(row==-1)//不存在该项目集 { tempItemSetNode=newitemsetsNode(); 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 List (2)函数实现 actionList=newList gotoList=newList erminal+="#"; //遍历项目集规范簇 foreach(itemsetsNodetempItemSetsNodeinitemsets) { foreach(ItemNodetempItemNodeintempItemSetsNode.itemsetsNodeValue) { if(tempItemNode.NextSymbol! ="#"&&nonterminal.Contains(tempItemNode.NextSymbol)==true) { //后继符号是非终结符号,则想goto表添加内容GotoNodegoTo=newGotoNode(); 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())//表示产生式左边是开始符号{ ActionNodeaction=newActionNode(); action.Num=int.Parse(tempItemSetsNode.no); action.Symbol=tempItemNode.NextSymbol; action.Value="acc"; actionList.Add(action); } else { intk; for(k=0;k { stringstr=tempItemNode.Item; str=str.Remove(tempItemNode.Item.Length-1); if(grammer[k].Equals(str)==true) { k++; break; } } foreach(charchinterminal) { ActionNodeaction=newActionNode(); action.Num=int.Parse(tempItemSetsNode.no); action.Symbol=ch.ToString(); action.Value="r"+k.ToString(); actionList.Add(action); } } } else { ActionNodeaction=newActionNode(); action.Num=int.Parse(tempItemSetsNode.no); action.Symbol=tempItemNode.NextSymbol; action.Value="s"+tempItemNode.NextStatus; actionList.Add(action); } } } } DisplayLrTable(this.listView2); 3.LR分析过程的实现 (1)变量定义 intstepCount=0; Stack 4、实验测试 Ø正规式——>NFA——>DFA——>MFA (1)输入一个表达式,将表达式转换为NFA (2)将NFA转换为DFA (3)将生成的DFA进行确定化,生成MFA ØLR(0)算法分析 (1)从文件读入LR(0)文法后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 重庆 理工大学 计算机 学院 编译 原理 课程设计 报告