编译原理 LL1文法源代码Word文档下载推荐.docx
- 文档编号:17501455
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:14
- 大小:18.02KB
编译原理 LL1文法源代码Word文档下载推荐.docx
《编译原理 LL1文法源代码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理 LL1文法源代码Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
voidInit();
/*初始化*/
intIndexCh(charch);
voidInputVt();
/*输入终结符*/
voidInputVn();
/*输入非终结符*/
voidShowChArray(char*collect,intnum);
/*输出Vn或Vt的内容*/
voidInputP();
/*产生式输入*/
boolCheckP(char*st);
/*判断产生式正确性*/
voidFirst(intU);
voidAddFirst(intU,intnCh);
/*加入first集*/
boolHaveEmpty(intnVn);
voidFollow(intV);
/*计算follow集*/
voidAddFollow(intV,intnCh,intkind);
voidShowCollect(structcollectNode**collect);
/*输出first或follow集*/
voidFirstFollow();
/*计算first和follow*/
voidCreateAT();
/*构造预测分析表*/
voidShowAT();
/*输出分析表*/
voidIdentify(char*st);
voidInitStack();
voidShowStack();
voidPop();
voidPush(intr);
voidmain(void){chartodo,ch;
Init();
InputVn();
InputVt();
InputP();
getchar();
FirstFollow();
printf("
所得first集为:
"
);
ShowCollect(first);
所得follow集为:
ShowCollect(follow);
CreateAT();
ShowAT();
todo='
y'
;
while('
==todo){printf("
\n是否继续进行句型分析?
(y/n):
todo=getchar();
!
=todo&
&
'
n'
=todo){printf("
\n(y/n)?
"
}if('
==todo){inti;
InitStack();
请输入符号串(以#结束):
ch=getchar();
i=0;
#'
=ch&
i<
MaxStLength){if('
\n'
=ch){st[i++]=ch;
}ch=getchar();
==ch&
MaxStLength){st[i]=ch;
Identify(st);
}else
输入出错!
\n"
}}
}voidInit(){inti,j;
vnNum=0;
vtNum=0;
PNum=0;
for(i=0;
=MaxVnNum;
i++)
Vn[i]='
\0'
=MaxVtNum;
Vt[i]='
MaxRuleNum;
i++){P[i].lCursor=NULL;
P[i].rHead=NULL;
P[i].rLength=0;
}PNum=0;
=MaxPLength;
buffer[i]='
MaxVnNum;
i++){first[i]=NULL;
follow[i]=NULL;
}for(i=0;
i++){for(j=0;
j<
=MaxVnNum+1;
j++)
analyseTable[i][j]=-1;
intIndexCh(charch){intn;
n=0;
/*isVn?
*/
while(ch!
=Vn[n]&
=Vn[n])
n++;
if('
return100+n;
/*isVt?
=Vt[n]&
=Vt[n])
returnn;
return-1;
}/*输出Vn或Vt的内容*/
voidShowChArray(char*collect){intk=0;
=collect[k]){printf("
%c"
collect[k++]);
}printf("
}/*输入非终结符*/
voidInputVn(){intinErr=1;
intn,k;
while(inErr){printf("
\n请输入所有的非终结符,注意:
请将开始符放在第一位,并以#号结束:
ch='
/*初始化数组*/
while(n<
MaxVnNum){Vn[n++]='
}n=0;
while(('
=ch)&
(n<
MaxVnNum)){if('
-1==IndexCh(ch)){Vn[n++]=ch;
vnNum++;
}Vn[n]='
/*以“#”标志结束用于判断长度是否合法*/
k=n;
=ch){if('
=(ch=getchar())){while('
=(ch=getchar()));
\n符号数目超过限制!
inErr=1;
continue;
/*正确性确认,正确则,执行下下面,否则重新输入*/
Vn[k]='
ShowChArray(Vn);
=ch){if('
=ch){printf("
输入正确确认?
(y/n):
}scanf("
%c"
&
ch);
==ch){printf("
录入错误重新输入!
}else{inErr=0;
}}}/*输入终结符*/
voidInputVt(){intinErr=1;
\n请输入所有的终结符,注意:
以#号结束:
MaxVtNum){Vt[n++]='
MaxVtNum)){if('
-1==IndexCh(ch)){Vt[n++]=ch;
vtNum++;
}Vt[n]='
Vt[k]='
ShowChArray(Vt);
}}}/*产生式输入*/
voidInputP(){charch;
inti=0,n,num;
请输入文法产生式的个数:
scanf("
%d"
num);
PNum=num;
/*消除回车符*/
\n请输入文法的%d个产生式,并以回车分隔每个产生式:
num);
while(i<
num){printf("
第%d个:
i);
for(n=0;
n<
MaxPLength;
n++)
buffer[n]='
/*输入产生式串*/
=(ch=getchar())&
MaxPLength){if('
=ch)
buffer[n++]=ch;
}buffer[n]='
if(CheckP(buffer)){pRNode*pt,*qt;
P[i].lCursor=IndexCh(buffer[0]);
pt=(pRNode*)malloc(sizeof(pRNode));
pt->
rCursor=IndexCh(buffer[3]);
next=NULL;
P[i].rHead=pt;
n=4;
=buffer[n]){qt=(pRNode*)malloc(sizeof(pRNode));
qt->
rCursor=IndexCh(buffer[n]);
next=qt;
pt=qt;
}P[i].rLength=n-3;
i++;
输入符号含非法在成分,请重新输入!
boolCheckP(char*st){intn;
if(100>
IndexCh(st[0]))
returnfalse;
-'
=st[1])
>
'
=st[2])
for(n=3;
=st[n];
n++){if(-1==IndexCh(st[n]))
}returntrue;
}voidFirst(intU){inti,j;
PNum;
i++){if(P[i].lCursor==U){structpRNode*pt;
pt=P[i].rHead;
j=0;
while(j<
P[i].rLength){if(100>
pt->
rCursor){AddFirst(U,pt->
rCursor);
break;
}else{if(NULL==first[pt->
rCursor-100]){First(pt->
}AddFirst(U,pt->
if(!
HaveEmpty(pt->
rCursor)){break;
}else{pt=pt->
next;
j++;
}if(j>
=P[i].rLength)/*当产生式右部都能推出空时*/
AddFirst(U,-1);
}}}/*加入first集*/
voidAddFirst(intU,intnCh){structcollectNode*pt,*qt;
intch;
/*用于处理Vn*/
pt=NULL;
qt=NULL;
if(nCh<
100){pt=first[U-100];
while(NULL!
=pt){if(pt->
nVt==nCh)
else{qt=pt;
pt=pt->
if(NULL==pt){pt=(structcollectNode*)malloc(sizeof(structcollectNode));
nVt=nCh;
if(NULL==first[U-100]){first[U-100]=pt;
}else{qt->
next=pt;
/*qt指向first集的最后一个元素*/}pt=pt->
else{pt=first[nCh-100];
=pt){ch=pt->
nVt;
if(-1!
=ch){AddFirst(U,ch);
}pt=pt->
}}}boolHaveEmpty(intnVn){if(nVn<
100)
structcollectNode*pt;
pt=first[nVn-100];
=pt){if(-1==pt->
nVt)
returntrue;
}returnfalse;
}voidFollow(intV){inti;
structpRNode*pt;
if(100==V)/*当为初始符时*/
AddFollow(V,-1,0);
i++){pt=P[i].rHead;
=pt&
rCursor!
=V)
if(NULL!
=pt){pt=pt->
if(NULL==pt){if(NULL==follow[P[i].lCursor-100]&
P[i].lCursor!
=V){Follow(P[i].lCursor);
}AddFollow(V,P[i].lCursor,0);
}else{while(NULL!
HaveEmpty(pt->
rCursor)){AddFollow(V,pt->
rCursor,1);
}if(NULL==pt){if(NULL==follow[P[i].lCursor-100]&
}else{AddFollow(V,pt->
}}}}}voidAddFollow(intV,intnCh,intkind){structcollectNode*pt,*qt;
100)/*为终结符时*/{pt=follow[V-100];
if(NULL==follow[V-100]){follow[V-100]=pt;
/*qt指向follow集的最后一个元素*/}pt=pt->
else{if(0==kind){pt=follow[nCh-100];
AddFollow(V,ch,0);
=ch){AddFollow(V,ch,1);
}}}}
voidShowCollect(structcollectNode**collect){inti;
=collect[i]){pt=collect[i];
\n%c:
\t"
Vn[i]);
=pt){if(-1!
=pt->
nVt){printf("
%c"
Vt[pt->
nVt]);
#"
}i++;
}/*计算first和follow*/
voidFirstFollow(){inti;
=Vn[i]){if(NULL==first[i])
First(100+i);
}i=0;
=Vn[i]){if(NULL==follow[i])
Follow(100+i);
voidCreateAT(){inti;
structpRNode*pt;
structcollectNode*ct;
rCursor)){ct=first[pt->
rCursor-100];
=ct){if(-1!
=ct->
analyseTable[P[i].lCursor-100][ct->
nVt]=i;
ct=ct->
}if(NULL==pt){ct=follow[P[i].lCursor-100];
else
analyseTable[P[i].lCursor-100][vtNum]=i;
else{if(100<
rCursor)/*不含空的非终结符*/{ct=first[pt->
=ct){analyseTable[P[i].lCursor-100][ct->
else/*终结符或者空*/{if(-1==pt->
rCursor){ct=follow[P[i].lCursor-100];
else/*当含有#号时*/
else/*为终结符*/{analyseTable[P[i].lCursor-100][pt->
rCursor]=i;
}}}}}/*输出分析表*/
voidShowAT(){inti,j;
构造预测分析表如下:
\t|\t"
vtNum;
i++){printf("
%c\t"
Vt[i]);
#\t\n"
---\t|---\t"
=vtNum;
---\t"
vnNum;
%c\t|\t"
for(j=0;
j++){if(-1!
=analyseTable[i][j])
R(%d)\t"
analyseTable[i][j]);
error\t"
voidIdentify(char*st){intcurrent,step,r;
/*r表使用的产生式的序号*/
\n%s的分析过程:
st);
步骤\t分析符号栈\t当前指示字符\t使用产生式序号\n"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 LL1文法源代码 编译 原理 LL1 文法 源代码