求first集和follow集

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
index=pos.front();
pos.pop();
right=p[index].right;
for(i=0;i<right.size();i++)
{
if(b==right[i])
{
index1=i;
break;
}
}
if(index1==right.size()-1)
{
s+=follow(p[index].left);
编译原理实验
实验名称:求first集和follow集
姓名:
学号:
教师签字:
成绩:
一.实验目的:
.掌握和了解first集和follow集的求解过程。
二.实验原理:
1.first集的求解:(1)若X∈Vt,则FIRST(X)={X};
(2)若X∈Vn,且有产生式X->a……,a∈Vt,则a∈FIRST(X);
}
else
{
rights=p[pos.front()].right;
for(i=0;i<rights.size();i++)
{
if(find(rights[i]))
{
s+=first(rights[i]);
index= s.find_last_of('@');
s=s.erase(index,1);
}
(3)若X∈Vn,X->@,则@∈FIRST(X)
(4)若X,Y1,Y2,Y3,Y4…………Yn都∈Vn,而产生式X->Y1,Y2……Yn.当Y1,Y2,Y3,Y4…………Yn都能=>@那么FIRST(X)=并集的FIRST(Yi)-{@}(0<=i<=n)
(5)若Yi=>@(i=1,2,3……),则FIRST(X)=并集的FIRST(Yi)-{@}并上{@}
pos.push(i);
}
while(!pos.empty())
{
if(!(p[pos.front()].right[0]<='Z' && p[pos.front()].right[0]>='A'))
{
if((int)s.find(p[pos.front()].right[0])==-1)
s.append(1,p[pos.front()].right[0]);
return true;
}
return false;
}
//**************************
bool findfo(char b) //查找是否有产生空的产生式
{
int i;
for(i=0;i<N;i++)
{
if(b==p[i].left && p[i].right[0]=='@')
for(i=0;i<s1.size();i++)
{
cout<<s1[i]<<" "<<follow(s1[i])<<endl;
}
return 0;
}
四.实验截图
cin>>N;
cout<<"请输入产生式,其中以@为空:"<<endl;
for(i=0;i<N;i++)
{
cin>>p[i].left>>b>>p[i].right;
}
cout<<"请输入识别符"<<endl;
cin>>B;
for(i=0;i<N;i++)
{
if((int)s1.find(p[i].left)==-1)
int N,K1=0,K2=0;
char B;
struct define *p=new define[10];
//************************
bool find(char b) //查找是否有产生空的产生式
{
int i;
for(i=0;i<N;i++)
{
if(b==p[i].left && p[i].right[0]=='@')
2.follow集的求解:(1)若为文法开始符号S,则FOLLOW(S)={#}
(2)若为文法A->aBb是一个产生式,则把FIRST(b)的非空元素加入FOLLOW(B)中。如果b->@则把FOLLOW(A)也加入FOLLOW(B)中。
三.实验代码
#include<iostream>
#include<vector>
return true;
}
return false;
}
//************************
string first(char b) //求解Frist集
{
int i,index;
queue<int> pos;
string s,rights;
for(i=0;i<N;i++)
{
if(b==p[i].left)
}
else
{
for(i=index1+1;i<right.size();i++)
{
if(findfo(right[i]))
{
s+=first(right[i]);
index= s.find_last_of('@');
s.erase(index,1);
}
else
{
s+=first(right[i]);
else
{
if(rights[i]>='A' && rights[i]<='Z')
s+=first(rights[i]);
else
s.append(1,rights[i]);
brBiblioteka Baiduak;
}
}
}
pos.pop();
}
return s;
}
//***********************
string follow(char b)//Follow集的求解
{
s1.append(1,p[i].left);
}
}
cout<<s1<<endl;
cout<<"非终结符的first集"<<endl;
for(i=0;i<s1.size();i++)
{
cout<<s1[i]<<" "<<first(s1[i])<<endl;
}
cout<<"非终结符的follow集"<<endl;
}
}
}
}
}
return s;
}
//******************************
int main()
{
int i;
string s1,s2;
char b;
cout<<"\t************求First集和Follow集**************"<<endl;
cout<<"请输入产生式的数目:";
#include<string>
#include <algorithm>
#include<queue>
using namespace std;
//*********************
struct define //产生式
{
char left;
string right;
};
//***************
{
int i,index,index1;
string s,right;
queue<int> pos;
if(b==B)
{
s.append(1,'#');
}
else
{
for(i=0;i<N;i++)
{
if((int)p[i].right.find(b)!=-1)
{
pos.push(i);
}
}
while(!pos.empty())
相关文档
最新文档