LL1语法分析c++实现first集follow集分析表分析栈.docx

上传人:b****5 文档编号:30727611 上传时间:2023-08-19 格式:DOCX 页数:29 大小:18.27KB
下载 相关 举报
LL1语法分析c++实现first集follow集分析表分析栈.docx_第1页
第1页 / 共29页
LL1语法分析c++实现first集follow集分析表分析栈.docx_第2页
第2页 / 共29页
LL1语法分析c++实现first集follow集分析表分析栈.docx_第3页
第3页 / 共29页
LL1语法分析c++实现first集follow集分析表分析栈.docx_第4页
第4页 / 共29页
LL1语法分析c++实现first集follow集分析表分析栈.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

LL1语法分析c++实现first集follow集分析表分析栈.docx

《LL1语法分析c++实现first集follow集分析表分析栈.docx》由会员分享,可在线阅读,更多相关《LL1语法分析c++实现first集follow集分析表分析栈.docx(29页珍藏版)》请在冰豆网上搜索。

LL1语法分析c++实现first集follow集分析表分析栈.docx

LL1语法分析c++实现first集follow集分析表分析栈

Cursor=NULL;

P[i].rHead=NULL;

P[i].rLength=0;

}

PNum=0;

for(i=0;i<=MaxPLength;i++)

buffer[i]='\0';

for(i=0;i

{

first[i]=NULL;

follow[i]=NULL;

}

for(i=0;i<=MaxVnNum;i++)

{

for(j=0;j<=MaxVnNum+1;j++)

analyseTable[i][j]=-1;

}

}

intIndexCh(charch)

{

intn;

n=0;/*isVn*/

while(ch!

=Vn[n]&&'\0'!

=Vn[n])

n++;

if('\0'!

=Vn[n])

return100+n;

n=0;/*isVt*/

while(ch!

=Vt[n]&&'\0'!

=Vt[n])

n++;

if('\0'!

=Vt[n])

returnn;

return-1;

}

/*输出Vn或Vt的内容*/

voidShowChArray(char*collect)

{

intk=0;

while('\0'!

=collect[k])

{

printf("%c",collect[k++]);

}

printf("\n");

}

/*输入非终结符*/

voidInputVn()

{

intinErr=1;

intn,k;

charch;

while(inErr)

{

printf("\n请输入所有的非终结符,注意:

");

printf("请将开始符放在第一位,并以#号结束:

\n");

ch='';

n=0;

/*初始化数组*/

while(n

{

Vn[n++]='\0';

}

n=0;

while(('#'!

=ch)&&(n

{

if(''!

=ch&&'\n'!

=ch&&-1==IndexCh(ch))

{

Vn[n++]=ch;

vnNum++;

}

ch=getchar();

}

Vn[n]='#';/*以“#”标志结束用于判断长度是否合法*/

k=n;

if('#'!

=ch)

{

if('#'!

=(ch=getchar()))

{

while('#'!

=(ch=getchar()))

;

printf("\n符号数目超过限制!

\n");

inErr=1;

continue;

}

}

/*正确性确认,正确则,执行下下面,否则重新输入*/

Vn[k]='\0';

ShowChArray(Vn);

ch='';

while('y'!

=ch&&'n'!

=ch)

{

if('\n'!

=ch)

{

printf("输入正确确认(y/n):

");

}

scanf("%c",&ch);

}

if('n'==ch)

{

printf("录入错误重新输入!

\n");

inErr=1;

}

else

{

inErr=0;

}

}

}

/*输入终结符*/

voidInputVt()

{

intinErr=1;

intn,k;

charch;

while(inErr)

{

printf("\n请输入所有的终结符,注意:

");

printf("以#号结束:

\n");

ch='';

n=0;

/*初始化数组*/

while(n

{

Vt[n++]='\0';

}

n=0;

while(('#'!

=ch)&&(n

{

if(''!

=ch&&'\n'!

=ch&&-1==IndexCh(ch))

{

Vt[n++]=ch;

vtNum++;

}

ch=getchar();

}

Vt[n]='#';

k=n;

if('#'!

=ch)

{

if('#'!

=(ch=getchar()))

{

while('#'!

=(ch=getchar()))

;

printf("\n符号数目超过限制!

\n");

inErr=1;

continue;

}

}

Vt[k]='\0';

ShowChArray(Vt);

ch='';

while('y'!

=ch&&'n'!

=ch)

{

if('\n'!

=ch)

{

printf("输入正确确认(y/n):

");

}

scanf("%c",&ch);

}

if('n'==ch)

{

printf("录入错误重新输入!

\n");

inErr=1;

}

else

{

inErr=0;

}

}

}

/*产生式输入*/

voidInputP()

{

charch;

inti=0,n,num;

printf("请输入文法产生式的个数:

");

scanf("%d",&num);

PNum=num;

getchar();/*消除回车符*/

printf("\n请输入文法的%d个产生式,并以回车分隔每个产生式:

",num);

printf("\n");

while(i

{

printf("第%d个:

",i);

/*初始化*/

for(n=0;n

buffer[n]='\0';

/*输入产生式串*/

ch='';

n=0;

while('\n'!

=(ch=getchar())&&n

{

if(''!

=ch)

buffer[n++]=ch;

}

buffer[n]='\0';

if(CheckP(buffer))

{

pRNode*pt,*qt;

P[i].lCursor=IndexCh(buffer[0]);

pt=(pRNode*)malloc(sizeof(pRNode));

pt->rCursor=IndexCh(buffer[3]);

pt->next=NULL;

P[i].rHead=pt;

n=4;

while('\0'!

=buffer[n])

{

qt=(pRNode*)malloc(sizeof(pRNode));

qt->rCursor=IndexCh(buffer[n]);

qt->next=NULL;

pt->next=qt;

pt=qt;

n++;

}

P[i].rLength=n-3;

i++;

}

else

printf("输入符号含非法在成分,请重新输入!

\n");

}

}

/*判断产生式正确性*/

boolCheckP(char*st)

{

intn;

if(100>IndexCh(st[0]))

returnfalse;

if('-'!

=st[1])

returnfalse;

if('>'!

=st[2])

returnfalse;

for(n=3;'\0'!

=st[n];n++)

{

if(-1==IndexCh(st[n]))

returnfalse;

}

returntrue;

}

voidFirst(intU)

{

inti,j;

for(i=0;i

{

if(P[i].lCursor==U)

{

structpRNode*pt;

pt=P[i].rHead;

j=0;

while(j

{

if(100>pt->rCursor)

{

AddFirst(U,pt->rCursor);

break;

}

else

{

if(NULL==first[pt->rCursor-100])

{

First(pt->rCursor);

}

AddFirst(U,pt->rCursor);

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)

break;

else

{

qt=pt;

pt=pt->next;

}

}

if(NULL==pt)

{

pt=(structcollectNode*)malloc(sizeof(structcollectNode));

pt->nVt=nCh;

pt->next=NULL;

if(NULL==first[U-100])

{

first[U-100]=pt;

}

else

{

qt->next=pt;/*qt指向first集的最后一个元素*/

}

pt=pt->next;

}

}

else

{

pt=first[nCh-100];

while(NULL!

=pt)

{

ch=pt->nVt;

if(-1!

=ch)

{

AddFirst(U,ch);

}

pt=pt->next;

}

}

}

boolHaveEmpty(intnVn)

{

if(nVn<100)

returnfalse;

structcollectNode*pt;

pt=first[nVn-100];

while(NULL!

=pt)

{

if(-1==pt->nVt)

returntrue;

pt=pt->next;

}

returnfalse;

}

voidFollow(intV)

{

inti;

structpRNode*pt;

if(100==V)/*当为初始符时*/

AddFollow(V,-1,0);

for(i=0;i

{

pt=P[i].rHead;

while(NULL!

=pt&&pt->rCursor!

=V)

pt=pt->next;

if(NULL!

=pt)

{

pt=pt->next;

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!

=pt&&HaveEmpty(pt->rCursor))

{

AddFollow(V,pt->rCursor,1);

pt=pt->next;

}

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

{

AddFollow(V,pt->rCursor,1);

}

}

}

}

}

voidAddFollow(intV,intnCh,intkind)

{

structcollectNode*pt,*qt;

intch;

pt=NULL;

qt=NULL;

if(nCh<100)/*为终结符时*/

{

pt=follow[V-100];

while(NULL!

=pt)

{

if(pt->nVt==nCh)

break;

else

{

qt=pt;

pt=pt->next;

}

}

if(NULL==pt)

{

pt=(structcollectNode*)malloc(sizeof(structcollectNode));

pt->nVt=nCh;

pt->next=NULL;

if(NULL==follow[V-100])

{

follow[V-100]=pt;

}

else

{

qt->next=pt;/*qt指向follow集的最后一个元素*/

}

pt=pt->next;

}

}

else

{

if(0==kind)

{

pt=follow[nCh-100];

while(NULL!

=pt)

{

ch=pt->nVt;

AddFollow(V,ch,0);

pt=pt->next;

}

}

else

{

pt=first[nCh-100];

while(NULL!

=pt)

{

ch=pt->nVt;

if(-1!

=ch)

{

AddFollow(V,ch,1);

}

pt=pt->next;

}

}

}

}

/*输出first或follow集*/

voidShowCollect(structcollectNode**collect)

{

inti;

structcollectNode*pt;

i=0;

while(NULL!

=collect[i])

{

pt=collect[i];

printf("\n%c:

\t",Vn[i]);

while(NULL!

=pt)

{

if(-1!

=pt->nVt)

{

printf("%c",Vt[pt->nVt]);

}

else

printf("#");

pt=pt->next;

}

i++;

}

printf("\n");

}

/*计算first和follow*/

voidFirstFollow()

{

inti;

i=0;

while('\0'!

=Vn[i])

{

if(NULL==first[i])

First(100+i);

i++;

}

i=0;

while('\0'!

=Vn[i])

{

if(NULL==follow[i])

Follow(100+i);

i++;

}

}

/*构造预测分析表*/

voidCreateAT()

{

inti;

structpRNode*pt;

structcollectNode*ct;

for(i=0;i

{

pt=P[i].rHead;

while(NULL!

=pt&&HaveEmpty(pt->rCursor))

{

ct=first[pt->rCursor-100];

while(NULL!

=ct)

{

if(-1!

=ct->nVt)

analyseTable[P[i].lCursor-100][ct->nVt]=i;

ct=ct->next;

}

pt=pt->next;

}

if(NULL==pt)

{

ct=follow[P[i].lCursor-100];

while(NULL!

=ct)

{

if(-1!

=ct->nVt)

analyseTable[P[i].lCursor-100][ct->nVt]=i;

else

analyseTable[P[i].lCursor-100][vtNum]=i;

ct=ct->next;

}

}

else

{

if(100<=pt->rCursor)/*不含空的非终结符*/

{

ct=first[pt->rCursor-100];

while(NULL!

=ct)

{

analyseTable[P[i].lCursor-100][ct->nVt]=i;

ct=ct->next;

}

}

else/*终结符或者空*/

{

if(-1==pt->rCursor)

{

ct=follow[P[i].lCursor-100];

while(NULL!

=ct)

{

if(-1!

=ct->nVt)

analyseTable[P[i].lCursor-100][ct->nVt]=i;

else/*当含有#号时*/

analyseTable[P[i].lCursor-100][vtNum]=i;

ct=ct->next;

}

}

else/*为终结符*/

{

analyseTable[P[i].lCursor-100][pt->rCursor]=i;

}

}

}

}

}

/*输出分析表*/

voidShowAT()

{

inti,j;

printf("构造预测分析表如下:

\n");

printf("\t|\t");

for(i=0;i

{

printf("%c\t",Vt[i]);

}

printf("#\t\n");

printf("---\t|---\t");

for(i=0;i<=vtNum;i++)

printf("---\t");

printf("\n");

for(i=0;i

{

printf("%c\t|\t",Vn[i]);

for(j=0;j<=vtNum;j++)

{

if(-1!

=analyseTable[i][j])

printf("R(%d)\t",analyseTable[i][j]);

else

printf("error\t");

}

printf("\n");

}

}

voidIdentify(char*st)

{

intcurrent,step,r;/*r表使用的产生式的序号*/

printf("\n%s的分析过程:

\n",st);

printf("步骤\t分析符号栈\t当前指示字符\t使用产生式序号\n");

step=0;

current=0;

printf("%d\t",step);

ShowStack();

printf("\t\t%c\t\t--\n",st[current]);

while('#'!

=st[current])

{

if(100>analyseStack[topAnalyse])

{

if(analyseStack[topAnalyse]==IndexCh(st[current]))

{

Pop();

current++;

step++;

printf("%d\t",step);

ShowStack();

printf("\t\t%c\t\t出栈、后移\n",st[current]);

}

else

{

printf("%c-%c不匹配!

",analyseStack[topAnalyse],st[current]);

printf("此串不是此文法的句子!

\n");

return;

}

}

else/*当为非终结符时*/

{

r=analyseTable[analyseStack[topAnalyse]-100][IndexCh(st[current])];

if(-1!

=r)

{

Push(r);

step++;

printf("%d\t",step);

ShowStack();

printf("\t\t%c\t\t%d\n",st[current],r);

}

else

{

printf("此串不是此文法的句子!

\n");

return;

}

}

}

if('#'==st[current])

{

if(0==topAnalyse&&'#'==st[current])

{

step++;

printf("%d\t",step);

ShowStack();

printf("\t\t%c\t\t分析成功!

\n",st[current]);

printf("%s是给定文法的句子!

\n",st);

}

else

{

while(topAnalyse>0)

{

if(100>analyseStack[topAnalyse]

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1