编译原理LL语法分析代码及结果Word文档格式.docx
- 文档编号:16350837
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:30
- 大小:45.07KB
编译原理LL语法分析代码及结果Word文档格式.docx
《编译原理LL语法分析代码及结果Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理LL语法分析代码及结果Word文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
/*first集*/
structcollectNode*follow[MaxVnNum+1];
/*follow集*/
intanalyseTable[MaxVnNum+1][MaxVtNum+1+1];
intanalyseStack[MaxStackDepth+1];
/*分析栈*/
inttopAnalyse;
/*分析栈顶*/
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)
{
\n是否继续进行句型分析?
(y/n):
todo=getchar();
!
=todo&
&
'
n'
=todo)
\n(y/n)?
"
}
if('
inti;
InitStack();
请输入符号串(以#结束):
ch=getchar();
i=0;
#'
=ch&
i<
MaxStLength)
\n'
=ch)
st[i++]=ch;
==ch&
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;
P[i].lCursor=NULL;
P[i].rHead=NULL;
P[i].rLength=0;
=MaxPLength;
buffer[i]='
MaxVnNum;
first[i]=NULL;
follow[i]=NULL;
for(j=0;
j<
=MaxVnNum+1;
j++)
analyseTable[i][j]=-1;
intIndexCh(charch)
intn;
n=0;
/*isVn?
*/
while(ch!
=Vn[n]&
=Vn[n])
n++;
return100+n;
/*isVt?
=Vt[n]&
=Vt[n])
returnn;
return-1;
voidShowChArray(char*collect)
intk=0;
=collect[k])
%c"
collect[k++]);
voidInputVn()
intinErr=1;
intn,k;
charch;
while(inErr)
\n请输入所有的非终结符,注意:
请将开始符放在第一位,并以#号结束:
ch='
/*初始化数组*/
while(n<
MaxVnNum)
Vn[n++]='
while(('
=ch)&
(n<
MaxVnNum))
-1==IndexCh(ch))
Vn[n++]=ch;
vnNum++;
Vn[n]='
/*以"
#"
标志结束用于判断长度是否合法*/
k=n;
if('
=(ch=getchar()))
;
\n符号数目超过限制!
inErr=1;
continue;
/*正确性确认,正确则,执行下下面,否则重新输入*/
Vn[k]='
ShowChArray(Vn);
输入正确确认?
(y/n):
scanf("
%c"
&
ch);
==ch)
录入错误重新输入!
else
inErr=0;
/*输入终结符*/
voidInputVt()
\n请输入所有的终结符,注意:
以#号结束:
MaxVtNum)
Vt[n++]='
MaxVtNum))
Vt[n++]=ch;
vtNum++;
Vt[n]='
Vt[k]='
ShowChArray(Vt);
voidInputP()
inti=0,n,num;
请输入文法产生式的个数:
%d"
num);
PNum=num;
/*消除回车符*/
\n请输入文法的%d个产生式,并以回车分隔每个产生式:
num);
while(i<
num)
第%d个:
i);
/*初始化*/
for(n=0;
n<
MaxPLength;
n++)
buffer[n]='
/*输入产生式串*/
=(ch=getchar())&
MaxPLength)
buffer[n++]=ch;
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)
if(100>
IndexCh(st[0]))
returnfalse;
-'
=st[1])
>
'
=st[2])
for(n=3;
=st[n];
n++)
if(-1==IndexCh(st[n]))
returntrue;
voidFirst(intU)
PNum;
if(P[i].lCursor==U)
structpRNode*pt;
pt=P[i].rHead;
j=0;
while(j<
P[i].rLength)
rCursor)
AddFirst(U,pt->
rCursor);
break;
if(NULL==first[pt->
rCursor-100])
First(pt->
}
if(!
HaveEmpty(pt->
rCursor))
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)
qt=pt;
if(NULL==pt)
pt=(structcollectNode*)malloc(sizeof(structcollectNode));
nVt=nCh;
if(NULL==first[U-100])
first[U-100]=pt;
next=pt;
/*qt指向first集的最后一个元素*/
pt=first[nCh-100];
ch=pt->
nVt;
if(-1!
AddFirst(U,ch);
boolHaveEmpty(intnVn)
if(nVn<
100)
structcollectNode*pt;
pt=first[nVn-100];
if(-1==pt->
nVt)
voidFollow(intV)
structpRNode*pt;
if(100==V)/*当为初始符时*/
AddFollow(V,-1,0);
=pt&
rCursor!
=V)
if(NULL!
if(NULL==pt)
if(NULL==follow[P[i].lCursor-100]&
P[i].lCursor!
=V)
Follow(P[i].lCursor);
AddFollow(V,P[i].lCursor,0);
HaveEmpty(pt->
AddFollow(V,pt->
rCursor,1);
voidAddFollow(intV,intnCh,intkind)
100)/*为终结符时*/
pt=follow[V-100];
if(NULL==follow[V-100])
follow[V-100]=pt;
/*qt指向follow集的最后一个元素*/
if(0==kind)
pt=follow[nCh-100];
AddFollow(V,ch,0);
AddFollow(V,ch,1);
voidShowCollect(structcollectNode**collect)
=collect[i])
pt=collect[i];
\n%c:
\t"
Vn[i]);
=pt->
%c"
Vt[pt->
nVt]);
#"
voidFirstFollow()
=Vn[i])
if(NULL==first[i])
First(100+i);
if(NULL==follow[i])
Follow(100+i);
voidCreateAT()
structpRNode*pt;
structcollectNode*ct;
rCursor))
ct=first[pt->
rCursor-100];
=ct)
=ct->
analyseTable[P[i].lCursor-100][ct->
nVt]=i;
ct=ct->
nex
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 LL 语法分析 代码 结果
![提示](https://static.bdocx.com/images/bang_tan.gif)