-
大小: 13KB文件类型: .cpp金币: 1下载: 0 次发布日期: 2021-06-03
- 语言: C/C++
- 标签: fundamentals
资源简介
编译原理的LL(1)文法判断代码,可以在codeblocks上无碍运行(凑字数用:祝大家学习进步天天开心)
代码片段和文件信息
#include
using namespace std;
#define MAX 100
struct state
{
char sta;//状态
string f[MAX];// 产生式
int num;//产生式个数
};
struct grammer
{
string VT ;//终结符
string VN;//非终结符
struct state states[MAX];//产生式
char S;//开始符
int tnum ;//终结符个数2
int nnum ;//非终结符 个数
string vns;//能推出空串的非终结符
};
struct grammer gram;//定义一个文法
string First[MAX];//first集合
string Follow[MAX];//follow集合
string FolChild[MAX];//follow[A]的子集序列
string Select[MAX][MAX];//select 集合 非终结符 产生式
int position(char astring s);//根据终态a查找a在有限状态集中的位置
void receiveGra();//接收文法
void calculateFirst();//计算FIRST集合
void calculateFollow();//计算FOLLOW集合
void calculateSelect();//计算select集合
int isallvn(string a);
int judge();//判断
void printGra();//输出文法
int main()
{
receiveGra();
calculateFirst();
calculateFollow();
calculateSelect();
printGra();
return 0;
}
void receiveGra() //接受文法
{
gram.tnum = 0;
gram.nnum = 0;
cout<<“请输入开始符:“< cin>>gram.S;
cout<<“请输入产生式以#结束(空串以^代替):“< string temp;
while(1)
{
cin>>temp;
if(temp[0]==‘#‘)
break;
int j = position(temp[0]gram.VN);//找到状态的位置
if(j<0) //未出现过
{
gram.VN+=temp[0];
gram.states[gram.nnum].sta = temp[0];
for(int m = 3; m gram.states[gram.nnum].f[0]+=temp[m];
gram.states[gram.nnum].num = 1;
gram.nnum++;
}
else //出现过
{
int n = gram.states[j].num;
for(int m = 3; m gram.states[j].f[n]+=temp[m];
gram.states[j].num++;
}
if(temp[3]==‘^‘)
if(position(gram.states[j].stagram.vns)<0)
gram.vns+=gram.states[j].sta;//能推出空串的非终结符
}
for(int i = 0; i {
struct state st = gram.states[i];
for(int j = 0; j {
string a = st.f[j];
for(int p = 0; p {
if(position(a[p]gram.VN)<0)
if(position(a[p]gram.VT)<0) gram.VT+=a[p];
}
}
}
cout<<“输入结束!“<
}
void calculateFirst() //计算FIRST集合 对每个非终结符计算first
{
struct state st;
for(int i = 0; i {
int flag = 0;//标志
st = gram.states[i];
if(position(st.stagram.VT)<0)
{
// cout< for(int j = 0; j {
string temp = st.f[j];
if(position(temp[0]gram.VT)!=-1) //遇到终结符
{
if(position(temp[0]First[i])<0)
{
First[i]+=temp[0];
flag = 1;
}
}
else
{
- 上一篇:fmod 音频库 c++ Qt编写
- 下一篇:C语言 华容道源代码
评论
共有 条评论