当前位置:
文档之家› first集和follow集生成算法模拟
first集和follow集生成算法模拟
(3) 输出First集;
(4)输出由文法G构造FOLLOW集的算法;
(5)输出FOLLOW集。
2.测试数据:
输入文法G[E]:
E → TE’
E’ → +TE’|ε
T → FT’
T’ → *FT’|ε
F->(E)|i
3.实现提示:
用数据库存储多行文法,用LIST控件显示算法,用GRID类依据算法进行作图。并实现算法与生成过程的关联。
{
p[i].left=strings.substr(0,j);
p[i].right=strings.substr(j+2,strings.length()-j);
}
}
}
//对每个文法符号求first集
string Letter_First(STR *p,char ch)
{
int t;
if(!(Vt.find(ch)>100))
FIRST(α)={a | α aβ,a∈VT,α,β∈V*}。
若α ε,ε∈FIRST(α)。
由定义可以看出,FIRST(α)是指符号串α能够推导出的所有符号串中处于串首的终结符号组成的集合。所以FIRST集也称为首符号集。
设α=x1x2…xn,FIRST(α)可按下列方法求得:
令FIRST(α)=Φ,i=1;
Vt +=p[i].left[j];
}
}
for(j=0;j<(int)p[i].right.length();j++)
{
if(!(p[i].right[j]>='A'&&p[i].right[j]<='Z'))
{
if(Vt.find(p[i].right[j])>100)
Vt +=p[i].right[j];
{
if(First[Vn.find(ch)].find(p[i].right[0])>100)
{
First[Vn.find(ch)]+=p[i].right[0];
}
}
if(p[i].right[0]=='*')
{
if(First[Vn.find(ch)].find('*')>100)
{
First[Vn.find(ch)]+='*';
(5)论文撰写(20分):优( )、良( )、中( )、一般( )、差( );
评阅人:职称:讲师
2015年6月19日
中文摘要
随着计算机科学的飞速发展,形式语言与自动机理论和方法研究也越来越收到人们的重视,但前者已经成为计算机科学的理论基础。此次的课程设计主要任务是研究自动机在编译方面的应用,并将重点放在求FIRST集和FOLLOW集。
课程设计(论文)任务书
软件学院学 院软件测试专 业1班
一、课程设计(论文)题目first集和follow集生成算法模拟
二、课程设计(论文)工作自2015年6月16日起至2013年6月19日止。
三、课程设计(论文)地点:软 件 学 院 实 训 中 心
四、课程设计(论文)内容要求:
1.本课程设计的目的
进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编
(3)若),其中x,y∈V*,则FOLLOW(B)∈FOLLOW(A);
3.实验内容:计算FIRST集和FOLLOW集
4.
二、需求分析
1.基本要求:
动态模拟算法的基本功能是:
(1)输入一个文法G;
(2)输出由文法G构造FIRST集的算法;
(2)输入由文法G构造First集的算法
(3)输出First集
(4)输入由文法G构造Follow集的算法
(5)输出Follow集
2.实验目的:
输入:任意的上下文无关文法。
输出:所输入的上下文无关文法一切非终结符的first集合和follow集合。
3.设文法G[S]=(VN,VT,P,S),则首字符集为:
若S …A,#∈FOLLOW(A)。
由定义可以看出,FOLLOW(A)是指在文法G[S]的所有句型中,紧跟在非终结符A后的终结符号的集合。
FOLLOW集可按下列方法求得:
(1)对于文法G[S]的开始符号S,有#∈FOLLOW(S);
(2)若文法G[S]中有形如B→xAy的规则,其中x,y∈V*,则FIRST(y)-{ε}∈FOLLOW(A);
{
first[Vt.find(ch)]="ch";
return first[Vt.find(ch)-1];
}
if(!(Vn.find(ch)>100))
{
for(int i=0;i<N;i++)
{
if(p[i].left[0]==ch)
{
if(!(Vt.find(p[i].right[0])>100))
}
else
{
if(Vn.find(p[i].right[j])>100)
Vn+=p[i].right[j];
}
}
}
}
void getlr(STR *p,int i)
{
int j;
for(j=0;j<strings.length();j++)
{
if(strings[j]=='-'&&strings[j+1]=='>')
高的问题。最后我想到了用递归方式。
下面总结此次课程设计的一些收获:
1.对程序设计理解,算法的设计,有了进一不的提高。
2.对程序调试的技巧收获不小。因为该程序主要是算法研究,所以程序分支较复杂。断点调试是必不可缺并且很实用的工作。
3.对程序到软件过程的理解。这次也是我第一次将自己做的程序制作成一个可自定义安装过程的小软件。从而将程序的运行与IDE脱离开来。
关键字:FIRST集,FOLLOW集,算法。
目录
八、附录.......................................11
一、课程设计任务及要求
1.任务:设计一个由正规文法生成First集和Follow集并进行简化的算法动态模拟。
First集和Follow集生成模拟算法的基本功能:
(1)输入一个文法G
三、设计思路
1.识别终结符集和非终结符集
Y
N
识别终结符集
识别非终结符集
2.计算所有非终结符的First集
N
Y
Y
N
3.计算所有非终结符的Follow集
N
Y N
Y
Y
四、详细设计
2.具体设计
通过分析输入的文法,分析出文法肿的非终结符和终结符,然后计算出每个非终结符的FIRST集和FOLLOW集。
当一个文法中存在ε产生式时,例如,存在A→ε,只有知道哪些符号可以合法地出现在非终结符A之后,才能知道是否选择A→ε产生式。这些合法地出现在非终结符A之后的符号组成的集合被称为FOLLOW集合。下面我们给出文法的FOLLOW集的定义。
设文法G[S]=(VN,VT,P,S),则
FOLLOW(A)={a | S … Aa …,a∈VT}。
2)创新要求:
动态模拟算法的基本功能是:
(1)输入一个文法G
(2)输出由文法G构造的FIRST集算法
(3)输出FIRST算法
(4)输出由文法G构造的FOLLOW集算法
(5)输出FOLLOW集
3)课程设计论文编写要求
(1)课程设计任务及要求
(2)设计思路--工作原理、功能规划
(3)详细设计---数据分析、算法思路、功能实现(含程序流程图、主要代码及注
释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,
巩固了哪些知识,有哪些提高。
(6)报告按规定排版打印,要求装订平整,否则要求返工;
(7)课设报告的装订顺序如下:封面---任务书---中文摘要---目录----正文---附录
(1)若xi∈VT,则xi∈FIRST(α);
(2)若xi∈VN;
① 若ε FIRST(xi),则FIRST(xi)∈FIRST(α);
② 若ε∈FIRST(xi),则FIRST(xi)-{ε}∈FIRST(α);
(3)i=i+1,重复(1)、(2),直到xi∈VT,(i=2,3,…,n)或xi∈VN且若ε FIRST(xi)或i>n为止。
(代码及相关图片)
(8)严禁抄袭,如有发现,按不及格处理。
4)课程设计评分标准:
(1)学习态度:20分;
(2)系统设计:20分;
(3)编程调试:20分;
(4)回答问题:20分;
(5)论文撰写:20分。
5)参考文献:
(1)张素琴,吕映芝.编译原理[M].,清华大学出版社
(2)蒋立源、康慕宁等,编译原理(第2版)[M],西安:西北工业大学出版社
}
}
if(!(Vn.find(p[i].right[0])>100))
{
if(p[i].right.length()==1)
{
string ff;
ff=Letter_First(p,p[i].right[0]);
for(int i_i=0;i_i<ff.length();i_i++)
{
for(j=0;j<(int)p[i].left.length();j++)