重庆理工大学编译原理实验文档格式.docx
- 文档编号:22825698
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:23
- 大小:215.78KB
重庆理工大学编译原理实验文档格式.docx
《重庆理工大学编译原理实验文档格式.docx》由会员分享,可在线阅读,更多相关《重庆理工大学编译原理实验文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
通过设计、编写和调试词法分析程序,了解扫描器的组成结构,不同种类单词的识别方法,掌握由单词的词法规则出发,画出识别单词的状态转换图,然后再用程序实现的扫描器的设计方法。
通过本实验,加深对词法分析作用的理解,掌握词法分析方法并编程实现一个词法分析器!
二、课程设计的内容及要求
读入源程序文件,进行词法分析,输出单词符号。
了解扫描器的组成结构,不同种类单词的识别方法,掌握由单词的词法规则出发,画出识别单词的状态转换图,然后再用程序实现的扫描器的设计方法。
三、实现原理
1.词法分析的作用就是从左到右扫描源程序,拼成单词,转换成统一的内部表示(token),送给语法分析器。
主要包括如下几个方面的内容:
2.组织源程序的输入;
3.按规则拼单词,并转换成二元形式;
4.滤掉空白符,跳过注释、换行符及一些无用符号(如字符常数的引号)
5.进行行列计数,用于指出出错的行列号,并复制出错部分;
6.列表打印源程序;
7.发现并定位词法错误;
8.生成符号表。
四、算法实现与流程图
五、测试数据
{Sampleprogram}
readx;
ifx<
0then{don’tcomputeifx<
=0}
fact:
=1;
repeat
=fact*x;
x:
=x-1;
untilx=0;
writefact;
end
六、结果输出及分析
七、软件运行环境及限制
MicrosoftVisualStudio2005
八、心得体会
通过学习和实验课上的词法分析程序的设计,更加明白了词法分析的重要性和其作用:
识别出一个一个的单词符号,加深对词法分析作用的理解。
九、参考文献
1.编译原理及实践教程,清华大学出版社,黄贤英、王柯柯,2008.2
2.编译原理难点重点分析、习题解析、实验指导,机械工业出版社,2008.3
3.VC++编程篇,高等教育出版社,2003.8
DFA的实现
掌握子集法,即将NFA转换为与之等价的DFA的算法。
1.通过设计编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。
2.输入一个NFA
3.输出与之等价的DFA
1、构造数据结构:
图的数据结构;
转换关系的数据结构。
2、求图的开始节点的ε-closure,作为子集链表的头节点。
然后对其ε-closure中的每个节点,根据转换关系,求出新的子集,将新求出的子集插入到子集链表的尾部。
构造主要的数据结构:
structdiagram{
intsnum;
//节点编号
move*transfer;
//转换关系
diagram*next;
};
//图的数据结构
structsubset{
//节点编号,
charclosure[MAX];
//该节点中包含原来
的哪些节点,也就是其ε_closure
//来源关系
subset*next;
//子集的数据结构
structmove{
intpoint;
//来自或转向哪一个节点
charinput;
//转向条件
move*next;
//存储来源关系
四、算法实现与流程
(1)读取文件中的数据,组成图的初始链表。
(2)将图的开始节点加入到其子集节点的closure数组中,调用求ε-closure的子函数求出图开始节点的ε-closure存储在该子集节点的closure数组中。
将该子集作为作为子集链表的头节点。
(3)遍历子集链表,对子集节点中closure数组中的每个元素,对其转换输入中的非ε元素,构造一个新的子集节点,将该输入之后所到达的节点插入新构造的子集节点的closure数组中,调用求ε-closure的子函数求该子集节点的ε-closure,存储在该子集节点的closure数组中。
同时构造构造转换关系节点,将该输入字母和来源节点编号填入该转换节点中,将该转换节点挂在刚才新构造的子集节点上。
(4)将新构造的子集节点插入子集链表中。
求ε-closure:
遍历closure数组中的每个元素,如果该元素节点的转换输入(图数据结构)中存在ε,则把输入ε之后能到达的那个节点插入closure数组(尾插法)。
(1)所有的插入操作,在插入的时候都需要比较即将插入的元素是否已经存在于插入对象中,如果已经存在,则不插入。
(2)对于子集的插入,采用尾插法,插入的时候给新的子集编号。
比较两个子集是否相同,是比较子集数据结构中的closure数组中的元素是否相同。
如个有相同的子集,则只把转换关系节点加入到已有的子集节点的转换关系链表中,不插入该子集节点。
(3)由于新的子集是在插入时才获得编号,所以,子集节点中转换关系链表和图中的转换链表有含义有所差别。
图中的是目的节点,输入字符;
子集中是来源节点,输入字符。
(4)为了便于比较closure数组,在每次求完ε-closure之后,有必要对closure数组中的元素进行排序。
输入表达式:
(a|b)*(aa|bb)(a|b)*
MicrosoftVisualC++6.0运行环境。
在手动从NFA确定DFA的基础上,将算法用C语言实现出来,加深了求DFA的算法的印象。
通过设计编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,更加了解了其中的算法。
LL1预测分析
二、课程设计的内容和要求
通过设计、编写和调试构造FIRST集和FOLLOW集和LL1预测分析表、利用LL1预测分析表的构造步骤、分析方法、对文法的要求。
能够从文法G出发,自动生成对应的分析表,并分析给定的符号串。
要求以表格或图形的方式实现。
给定一个文法,4.3.1的算法求文法中每个非终结符的First和Follow集,然后依据文法和相应的First和Follow集生成LL
(1)分析表。
输入:
文法G;
输出:
分析表M;
方法:
(1)对文法G的每个产生式A→α执行第2步和第3步;
(2)对每个终结符a∈FIRST(α),则把A→α加至M[A,a]中;
(3)若ε∈FIRST(α),则构造FOLLOW(A),对任何元素b∈FOLLOW(A),把A→α加至M[A,b]中;
若ε∈FIRST(α),且#∈FOLLOW(A),把A→α加至M[A,#]中;
(4)把所有无定义的M[A,a]标上“出错标志”。
构造数据结构:
产生式的数据结构;
侯选式的数据结构;
first集和follow集的存储结构等。
structsponser{
charvn;
//产生式的非终结符
structcandidate*candidatelist;
//侯选式链表
structcandidate*firstrelation;
structcandidate*followrelation;
charfirst[MAX];
//存储first集
charfollow[MAX];
//存储follow集
structsponser*next;
//产生式的数据结构
四、算法实现
FIRST集的算法:
计算文法G中每一个文法符号A(A∈VN∪VT)的FIRST集可用如下算法:
(1)若有产生式A→aα,a∈VT,则把a加入到FIRST(A)中;
(2)若有产生式A→ε,则把ε加入到FIRST(A)中;
(3)若有产生式A→Xα,X∈VN,则把FIRST(X)中非ε元素加入到FIRST(A)中;
(4)若有产生式A→X1X2X3...Xkα,其中X1X2X3...Xk∈VN。
则
当X1X2X3...Xi→ε(1≤i≤k)时,则把FIRST(Xi+1...Xkα)的所有非ε元素加入FIRST(A)中;
当X1X2X3...Xk→ε时,则把FIRST(α)加入FIRST(A)中。
连续使用上述规则,直到每个集合的FIRST不再增大为止。
FOLLOW集的:
计算文法G的每个非终结符A的FOLLOW集可使用如下算法:
(1)如果A是开始符号,#∈FOLLOW(A);
(2)若有产生式B→αAaβ,a∈VT,则把a加入到FOLLOW(A)中;
(3)若有产生式B→αAXβ,X∈VN,则把FIRST(Xβ)中非ε元素加FOLLOW(A)中;
(4)若B→αA,或B→αAβ且βε,则把FOLLOW(B)加到FOLLOW(A)中;
连续使用上述规则,直到每个FOLLOW不再增大为止。
E->
TA
A->
+TA|#
T->
FB
B->
*FB|#
F->
(E)|i
六、结果输出及设计
First集:
Follow集:
LL1预测分析表:
对给定的符号串分析:
MicrosoftVisualStudio2006
语法分析主要有自上而下和自下而上两种方法,其中自上而下的分析方法中有递归下降和LL1两种方式,通过本节的学习与实验,在LL1预测分析实验中会求First、Follow集,并理解其的算法,掌握了计算预测分析表的方法,并能根据预测分析表对给定的符号串分析。
算符优先分析
通过设计、编写和调试构造FirstVT集合、LastVT集和构造算符优先分析表、对给定符号串进行分析的程序,了解构造算符优先分析表的步骤,对文法的要求,生成算符优先关系表的算法,对给定的符号串进行分析的方法。
二、课程设计的内容及其要求
给定一个上下无关文法,根据算法设计一个程序,求文法中每个非终结符的FirstVT集和LastVT集。
(1)开始:
符号栈中为#,输入缓冲区为:
输入串#
(2)移进-归约:
①从左向右扫描输入符号并移进堆栈,依次查找优先矩阵,直至找到某个j满足aj>
aj+1时为止;
②从aj开始往左扫描符号栈,直至找到某个i满足ai-1<
ai为止;
③Niai…NjajNj+1形式的子串即为最左素短语,用相应产生式进行归约。
(3)结束:
符号栈中为#S,输入缓冲区为#,分析成功;
否则失败。
将所有的产生式存储在一个链表中。
(1)遍历产生式链表,遍历每个产生式节点的候选式链表:
若它形如Pa…或PQa…,则将a加入该产生式的firstvt数组;
若有形如PQ…的产生式,则建立一个新的节点,节点的内容就是Q,将该节点挂在产生式的firstrelation链表下面。
(2)遍历产生式链表,遍历每个产生式节点的firstrelation链表:
查找该节点所存非终结符的产生式节点;
如果它的firstvt不为空,则将其中的所有元素加在当前所处的产生式节点的firstvt数组中。
如果它的firstrelation链表不为空,则将此链表中的节点一一插在当前产生式的firstrelation链表后面(内容相同的节点不插入)。
(3)消除firstvt中的元素重复。
四、算法实现流程图
FirstVT集:
FIRSTVT(P)={a|Pa…或PQa…,a∈VT而Q∈VN},即P能推导出的第一个终结符号。
FIRSTVT(P)的构造算法基于下面两条规则:
(1)若有产生式Pa…或PQa…,则a∈FIRSTVT(P),其中P、Q∈VN,a∈VT;
(2)若a∈FIRSTVT(Q),且有产生式PQ…,则a∈FIRSTVT(P)。
LastVT集:
LASTVT(P)={a|P…a或P…aQ,a∈VT而Q∈VN},即P能推导出的最后一个终结符号。
计算LastVT集的算法基于下面两条规则:
(1)若有产生式P…a或P…aQ,则a∈LASTVT(P),其中P、Q∈VN,a∈VT;
(2)若a∈LASTVT(Q),且有产生式P…Q,则a∈LASTVT(P)。
E+T|T
T*F|F
六、结果输出
算法分析表:
通过本节实验的学习与掌握,加深了对求FirstVT、LastVT集的印象,并掌握和运用之,并能根据其掌握构造算符优先关系表的方法。
LR预测分析
通过设计、编写和调试构造LR0项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR0分析表的步骤,对文法的要求,能够从文法G出发生成LR0分析表,并能对给定的符号串进行分析。
给定一个LR0文法,求出其项目集规范簇,结果以图形或者表格的形式实现。
(1)读取文法,按照一定的规则存储产生式
(2)扩展文法
(3)以扩展后的S‘S产生式,求出
S‘·
S的closure集。
(4)以S‘·
S的closure集为起点,逐步应用转换函数GO(I,X)求出新的项目集,直到不出现新的项目集为止。
扩展文法,求出S‘·
S的closure集。
插入项目集链表。
根据项目集中的项目
如果该项目中的.不是最后一位
对每一个项目的.右移一位。
得到一个新的项目,把该项目加到新的项目集N中。
如果新项目中.后是一个非终结符(假如是B),把该非终结符推出的产生式的右部加上.(.加在产生式的右部之前)又得到一个新的项目,并把该项目加到项目集N中。
将该项目集加入到项目集链表的最后(如果链表中已经有了该项目集,则不加入)
LR(0)分析表的构造算法
对于A·
XIk,GO(Ik,X)=Ij
若XVt,则置action[k,X]=Sj,即把(j,a)移进栈
若XVn,则置goto[Ik,X]=j
Ik,则对所有的xVt和#,均置action[k,x]=rj(设A是第j个产生式),即用A归约)
若S'
S·
Ik,则置action[k,#]=acc,即接受
其他均置出错。
aA|bB
cA|d
cB|d
六、结果输出及其分析
LR0项目集规范簇:
LR分析表:
七、软件运行环境及其限制
通过本实验的学习,掌握并理解了根据给定的一个LR0文法,求其项目集规范簇,求其LR0分析表的方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 重庆 理工大学 编译 原理 实验