資源簡介
編譯原理用C語言求first集sellect集follow集,最后,判斷給出的文法是否是LL(1)文
代碼片段和文件信息
#include
#include
#include
typedef?struct?Node
{
char?nonTerminal;
char?str[10];????//用來存放各個(gè)產(chǎn)生式右邊的字符串
int?tag;?????????//用來標(biāo)記是否能推出空
char?first[10];??//用來存放非終結(jié)符的first集合
char?firsts[10];?//用來存放字符串的first集合
char?follow[10];??//用來存放各個(gè)非終結(jié)符的follow集
char?formFollow[10];//用來存放各個(gè)非終結(jié)符的follow集合的組成部分
int?fol;????????//用來標(biāo)記非終結(jié)符是否已經(jīng)計(jì)算過follow集
char?sellect[10];//用來存放sellect集合
int?fir;???//用來標(biāo)志非終結(jié)符的first集合是否計(jì)算過,0表示沒有,1表示計(jì)算過
}nonTer*nonTerminal;
typedef?struct?
{
char?Ldata;
// int?tag1;?//用來標(biāo)記是否能推出空
int?tag2;//用來標(biāo)記該產(chǎn)生式是否被刪除
}LeftData;
typedef?struct?node
{
LeftData?lData;
char?mData[2];
char?rData[10];//產(chǎn)生式右邊字符串最大值為10
}Pro;
typedef?struct
{
Pro?proNum[50];????//輸入產(chǎn)生式的最大數(shù)量????????
}Production;
static?int?num=0;??//統(tǒng)計(jì)實(shí)際輸入產(chǎn)生式的數(shù)量
int?sum=1;???//統(tǒng)計(jì)非終結(jié)符的數(shù)量
Production?init()??//初始化產(chǎn)生式
{
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()??//輸入產(chǎn)生式
{
int?i=0j=0;
Production?p;
p=init();
printf(“依次輸入各個(gè)產(chǎn)生式,每次以回車結(jié)束;?用‘#‘結(jié)束,表示不再有產(chǎn)生式要輸入\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(“輸入產(chǎn)生是的數(shù)量超過上限程序不能處理\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)??//判斷產(chǎn)生式是否合法
{
int?mid1mid2right=0;
int?i;
????int?flag=0;
mid1=0;
mid2=1;
right=0;
if(num==0)
{
printf(“產(chǎn)生式個(gè)數(shù)為零\n“);
return?0;
}
for(i=0;i {
if(p.proNum[i].lData.Ldata>‘Z‘||p.proNum[i].lData.Ldata<‘A‘)
{
printf(“產(chǎn)生式左部應(yīng)該為非終結(jié)符(大寫字母)\n“);
return?0;
}
if(p.proNum[i].mData[mid1]!=‘-‘||p.proNum[i].mData[mid2]!=‘>‘)
{
printf(“產(chǎn)生式中間->有誤\n“);
return?0;
}
while(p.proNum[i].rData[right]!=‘\0‘)
{
if((p.proNum[i].rData[right]==‘*‘)||(p.proNum[i].rData[right]>=‘a(chǎn)‘&&p.proNum[i].rData[right]<=‘z‘)
||(p.proNum[i].rData[right]>=‘A‘&&(p.proNum[i].rData[right]<=‘Z‘)))
flag=1;
if(flag!=1)
{
printf(“產(chǎn)生式右部輸入不符合要求!\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++選課系統(tǒng)
- 下一篇:電話簿管理程序C++語言編寫
評論
共有 條評論