-
大小: 199KB文件类型: .rar金币: 1下载: 0 次发布日期: 2021-06-05
- 语言: C/C++
- 标签: firstfollow
资源简介
编译原理实验 first、follow、select集合的求解,经测试正确,c语言编写
代码片段和文件信息
#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)
{
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 204860 2013-05-27 15:33 ll1\Debug\ll1.exe
文件 190988 2013-05-27 15:33 ll1\Debug\ll1.ilk
文件 43273 2013-05-27 15:33 ll1\Debug\ll1.obj
文件 225860 2013-05-27 15:32 ll1\Debug\ll1.pch
文件 377856 2013-05-27 15:33 ll1\Debug\ll1.pdb
文件 33792 2013-05-27 15:34 ll1\Debug\vc60.idb
文件 45056 2013-05-27 15:33 ll1\Debug\vc60.pdb
文件 34488 2013-05-27 15:33 ll1\ll1.cpp
文件 4248 2013-05-27 15:32 ll1\ll1.dsp
文件 531 2013-05-27 15:24 ll1\ll1.dsw
文件 41984 2013-05-27 16:00 ll1\ll1.ncb
文件 48640 2013-05-27 16:00 ll1\ll1.opt
文件 880 2013-05-27 15:33 ll1\ll1.plg
目录 0 2013-06-03 09:26 ll1\Debug
目录 0 2013-06-03 09:26 ll1
----------- --------- ---------- ----- ----
1252456 15
- 上一篇:八皇后问题-爬山法
- 下一篇:数据结构表达式求值,c语言版,能计算多位数
评论
共有 条评论