资源简介
编译原理用C语言求first集sellect集follow集,最后,判断给出的文法是否是LL(1)文
代码片段和文件信息
#include
#include
#include
typedef struct Node
{
char nonTerminal;
char str[10]; //用来存放各个产生式右边的字符串
int tag; //用来标记是否能推出空
char first[10]; //用来存放非终结符的first集合
char firsts[10]; //用来存放字符串的first集合
char follow[10]; //用来存放各个非终结符的follow集
char formFollow[10];//用来存放各个非终结符的follow集合的组成部分
int fol; //用来标记非终结符是否已经计算过follow集
char sellect[10];//用来存放sellect集合
int fir; //用来标志非终结符的first集合是否计算过,0表示没有,1表示计算过
}nonTer*nonTerminal;
typedef struct
{
char Ldata;
// int tag1; //用来标记是否能推出空
int tag2;//用来标记该产生式是否被删除
}LeftData;
typedef struct node
{
LeftData lData;
char mData[2];
char rData[10];//产生式右边字符串最大值为10
}Pro;
typedef struct
{
Pro proNum[50]; //输入产生式的最大数量
}Production;
static int num=0; //统计实际输入产生式的数量
int sum=1; //统计非终结符的数量
Production init() //初始化产生式
{
Production p;
int ij;
for(i=0;i<50;i++)
{
for(j=0;j<10;j++)
{
p.proNum[i].rData[j]=‘\0‘;
}
}
return p;
}
Production input() //输入产生式
{
int i=0j=0;
Production p;
p=init();
printf(“依次输入各个产生式,每次以回车结束; 用‘#‘结束,表示不再有产生式要输入\n“);
while((p.proNum[i].lData.Ldata=getchar())!=‘#‘)
{
scanf(“%c%c“&p.proNum[i].mData[0]&p.proNum[i].mData[1]);
scanf(“%s“&p.proNum[i].rData);
// p.proNum[i].lData.tag1=0;
p.proNum[i].lData.tag2=1;
getchar();
if(j>20)
{
printf(“输入产生是的数量超过上限程序不能处理\n“);
}
num++;
i++;
}
return p;
}
Production copyProduction(Production p)
{
Production cp;
int ij;
for(i=0;i {
cp.proNum[i].lData.Ldata=p.proNum[i].lData.Ldata;
// cp.proNum[i].lData.tag1=p.proNum[i].lData.tag1;
cp.proNum[i].lData.tag2=p.proNum[i].lData.tag2;
cp.proNum[i].mData[0]=p.proNum[i].mData[0];
cp.proNum[i].mData[1]=p.proNum[i].mData[1];
for(j=0;j<10;j++)
{
cp.proNum[i].rData[j]=p.proNum[i].rData[j];
}
}
return cp;
}
int isJudLegal(Production p) //判断产生式是否合法
{
int mid1mid2right=0;
int i;
int flag=0;
mid1=0;
mid2=1;
right=0;
if(num==0)
{
printf(“产生式个数为零\n“);
return 0;
}
for(i=0;i {
if(p.proNum[i].lData.Ldata>‘Z‘||p.proNum[i].lData.Ldata<‘A‘)
{
printf(“产生式左部应该为非终结符(大写字母)\n“);
return 0;
}
if(p.proNum[i].mData[mid1]!=‘-‘||p.proNum[i].mData[mid2]!=‘>‘)
{
printf(“产生式中间->有误\n“);
return 0;
}
while(p.proNum[i].rData[right]!=‘\0‘)
{
if((p.proNum[i].rData[right]==‘*‘)||(p.proNum[i].rData[right]>=‘a‘&&p.proNum[i].rData[right]<=‘z‘)
||(p.proNum[i].rData[right]>=‘A‘&&(p.proNum[i].rData[right]<=‘Z‘)))
flag=1;
if(flag!=1)
{
printf(“产生式右部输入不符合要求!\n“);
return 0;
}
right++;
flag=0;
}
right=0;
}
return 1;
}
int leftRecursive(Production pnonTer nT[20]) //判断是否有左递归,有则返回1,否则返回0
{
int ij;
char ch1ch2;
for(i=0;i {
if(p.proNum[i].lData.Ldata==p.proNum[i].rData[0])
{
printf(“文法含有直接左递归!!!!!\n“);
return 1;
}
}
for(i=0;i {
c
- 上一篇:C++选课系统
- 下一篇:电话簿管理程序C++语言编写
评论
共有 条评论