4编译原理算符优先算法分析程序.docx

上传人:b****8 文档编号:12939050 上传时间:2023-06-09 格式:DOCX 页数:13 大小:17.43KB
下载 相关 举报
4编译原理算符优先算法分析程序.docx_第1页
第1页 / 共13页
4编译原理算符优先算法分析程序.docx_第2页
第2页 / 共13页
4编译原理算符优先算法分析程序.docx_第3页
第3页 / 共13页
4编译原理算符优先算法分析程序.docx_第4页
第4页 / 共13页
4编译原理算符优先算法分析程序.docx_第5页
第5页 / 共13页
4编译原理算符优先算法分析程序.docx_第6页
第6页 / 共13页
4编译原理算符优先算法分析程序.docx_第7页
第7页 / 共13页
4编译原理算符优先算法分析程序.docx_第8页
第8页 / 共13页
4编译原理算符优先算法分析程序.docx_第9页
第9页 / 共13页
4编译原理算符优先算法分析程序.docx_第10页
第10页 / 共13页
4编译原理算符优先算法分析程序.docx_第11页
第11页 / 共13页
4编译原理算符优先算法分析程序.docx_第12页
第12页 / 共13页
4编译原理算符优先算法分析程序.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

4编译原理算符优先算法分析程序.docx

《4编译原理算符优先算法分析程序.docx》由会员分享,可在线阅读,更多相关《4编译原理算符优先算法分析程序.docx(13页珍藏版)》请在冰点文库上搜索。

4编译原理算符优先算法分析程序.docx

4编译原理算符优先算法分析程序

#include

#include

#include

typedefstruct

{   charR;

    charr;

    intflag;

}array;

typedefstruct

{charE;

    chare;

}charLode;

typedefstruct

{    charLode*base;

    inttop;

}charstack;

charstr[80][80],arr[80][80],brr[80][80];

arrayF[20];

intm,kk,p,ppp,FF=1;

charr[10];

intcrr[20][20],FLAG=0;

charccrr1[1][20],ccrr2[20][1];

voidInitstack(charstack&s)//定义栈

{    s.base=newcharLode[20];

    s.top=-1;

}

voidpush(charstack&s,charLodew)    //入栈

{  s.top++;

  s.base[s.top].E=w.E;

  s.base[s.top].e=w.e;

}

voidpop(charstack&s,charLode&w)    //出栈

{  w.E=s.base[s.top].E;

  w.e=s.base[s.top].e;

  s.top--;

}

intIsEmpty(charstacks)    //判断是否到栈顶

{   if(s.top==-1)

        return1;

    else

        return0;

}

intIsLetter(charch)    //判断是不是大写字母(非终结符)

{  if(ch>='A'&&ch<='Z')

      return1;

  else

      return0;

}

intjudge1(intn)

{    intj=3,flag=0;

    for(inti=0;i<=n;i++)

        while(str[i][j]!

='\0')

        {         chara=str[i][j];

            charb=str[i][j+1];

            if(IsLetter(a)&&IsLetter(b))    //两个非终结符相连,不是算符文法

            {          flag=1;

                break;

            }

            else

                j++;

        }

                if(flag==1)        //根据flag设定返回值

            return0;

        else

            return1;

}

voidjudge2(intn)

{    for(inti=0;i<=n;i++)

        if(str[i][3]=='~'||FLAG==1)//'~'代表空

        {            cout<<"文法G不是算符优先文法!

"<

            FF=0;

            break;

        }

                if(i>n)

            cout<<"文法G是算符优先文法!

"<

}

intsearch1(charr[],intkk,chara)

{   for(inti=0;i

        if(r[i]==a)

            break;

        if(i==kk)

            return0;

        else

            return1;

}

voidcreateF(intn)

{    intk=0,i=1;charg;

    chart[10];//t数组用来存放非终结符

    t[0]=str[0][0];

    while(i<=n)

    {       if(t[k]!

=str[i][0])

        {           k++;

            t[k]=str[i][0];

            g=t[k];

            i++;        }

        elsei++;    }

    kk=0;

    charc;

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

    {     intj=3;

        while(str[i][j]!

='\0')

        {         c=str[i][j];

            if(IsLetter(c)==0)

            {               if(!

search1(r,kk,c))

                    r[kk]=c;

                kk++;//r数组用来存放终结符            }

            j++;        }    }

    m=0;

    for(i=0;i

        for(intj=0;j

        {            F[m].R=t[i];

            F[m].r=r[j];

            F[m].flag=0;

            m++;        }}

voidsearch(charLodew)

{    for(inti=0;i

        if(F[i].R==w.E&&F[i].r==w.e)

        {            F[i].flag=1;break;        }

}

voidFirstVT(intn)//求FirstVT

{    charstacksta;

    charLodew;

    inti=0;

    Initstack(sta);

    while(i<=n)

    {        intk=3;

        w.E=str[i][0];

        chara=str[i][k];

        charb=str[i][k+1];

        if(!

IsLetter(a))    //产生式的后选式的第一个字符就是终

       {            w.e=a;

            push(sta,w);

            search(w);

            i++;

        }

        elseif(IsLetter(a)&&b!

='\0'&&!

IsLetter(b))        //产生式的后选式的第一个字符是非终结符的情况

        {            w.e=b;

            push(sta,w);

            search(w);

            i++;        }

        elsei++;

}

    charLodeww;

    while(!

IsEmpty(sta))

    {        pop(sta,ww);

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

        {            w.E=str[i][0];

            if(str[i][3]==ww.E&&str[i][4]=='\0')

            {              w.e=ww.e;

                push(sta,w);

                search(w);

                break;            }        }    }

    p=0;intk=1;i=1;

    while(i

    {        if(F[i-1].flag==1)

        {            arr[p][0]=F[i-1].R;

            arr[p][k]=F[i-1].r;

        }

        while(F[i].flag==0&&i

            i++;

        if(F[i].flag==1)

        {            if(F[i].R==arr[p][0])

                k++;

            else{arr[p][k+1]='\0';p++;k=1;}

            i++;        }    }  }

voidLastVT(intn)//求LastVT

{   charstacksta;

    charLodew;

    for(inti=0;i

        F[i].flag=0;

    i=0;

    Initstack(sta);

    while(i<=n)

    {        intk=strlen(str[i]);

        w.E=str[i][0];

        chara=str[i][k-1];

        charb=str[i][k-2];

        if(!

IsLetter(a))

        {            w.e=a;

            push(sta,w);

            search(w);

            i++;      }

        elseif(IsLetter(a)&&!

IsLetter(b))

        {        w.e=b;

            push(sta,w);

            search(w);

            i++;    }

        elsei++;    }

    charLodeee;

    while(!

IsEmpty(sta))

    {        pop(sta,ee);

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

        {            w.E=str[i][0];

            if(str[i][3]==ee.E&&str[i][4]=='\0')

            {               w.e=ee.e;

                push(sta,w);

                search(w);          }       }    }

    intk=1;i=1;

    ppp=0;

    while(i

    {       if(F[i-1].flag==1)

        {           brr[ppp][0]=F[i-1].R;

            brr[ppp][k]=F[i-1].r;

        }

        while(F[i].flag==0&&i

            i++;

        if(F[i].flag==1)

        {           if(F[i].R==arr[ppp][0])

                k++;

            else{brr[ppp][k+1]='\0';ppp++;k=1;}

            i++;       }    }  }

voidcreateYXB(intn)//构造优先表

{   inti,j;

    for(j=1;j<=kk;j++)

        ccrr1[0][j]=r[j-1];

    for(i=1;i<=kk;i++)

        ccrr2[i][0]=r[i-1];

    for(i=1;i<=kk;i++)

        for(j=1;j<=kk;j++)

            crr[i][j]=0;

        intI=0,J=3;

        while(I<=n)

        {         if(str[I][J+1]=='\0')        //扫描右部

            {                I++;

                J=3;

            }

            else

            {                while(str[I][J+1]!

='\0')

                {                    charaa=str[I][J];

                    charbb=str[I][J+1];

                    if(!

IsLetter(aa)&&!

IsLetter(bb))//优先及等于的情况,用1值表示等于

                    {                        for(i=1;i<=kk;i++)

                        {                         if(ccrr2[i][0]==aa)

                                break;

                        }

                        for(j=1;j<=kk;j++)

                        {                          if(ccrr1[0][j]==bb)

                                break;  

                        }

                        if(crr[i][j]==0)

                            crr[i][j]=1;

                        else{                        FLAG=1;

                            I=n+1;

                        }

                        J++;

                    }

                    if(!

IsLetter(aa)&&IsLetter(bb)&&str[I][J+2]!

='\0'&&!

IsLetter(str[I][J+2]))//优先及等于的情况

                    {      for(i=1;i<=kk;i++

                    {       if(ccrr2[i][0]==aa)       break;

                        }

       for(intj=1;j<=kk;j++)

                        {

       if(ccrr1[0][j]==str[I][J+2])

                                break;

                        }

                        if(crr[i][j]==0)

                            crr[i][j]=1;

                        else

                        {

                            FLAG=1;

                            I=n+1;

                        }

                    }

                    if(!

IsLetter(aa)&&IsLetter(bb))//优先及小于的情况,用2值表示小于

                    {  

                        for(i=1;i<=kk;i++)

                        {

                            if(aa==ccrr2[i][0])

                                break;

                        }

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

                        {

                            if(bb==arr[j][0])

                                break;

                        }

                        for(intmm=1;arr[j][mm]!

='\0';mm++)

                        {

                            for(intpp=1;pp<=kk;pp++)

                            {

                                if(ccrr1[0][pp]==arr[j][mm])

                                    break;

                            }

                            if(crr[i][pp]==0)

                                crr[i][pp]=2;

                            else{

                                FLAG=1;I=n+1;

                            }

                        }

                        J++;

                    }

                    if(IsLetter(aa)&&!

IsLetter(bb))//优先及大于的情况,用3值表示大于

                    {

                        for(i=1;i<=kk;i++)

                        {

                            if(ccrr1[0][i]==bb)

                                break;

                        }

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

                        {                            if(aa==brr[j][0])

                                break;

                        }

                        for(intmm=1;brr[j][mm]!

='\0';mm++)

                        {  

                            for(intpp=1;pp<=kk;pp++)

                            {

                                if(ccrr2[pp][0]==brr[j][mm])

                                    break;

                            }

                            if(crr[pp][i]==0)

                                crr[pp][i]=3;

                            else{FLAG=1;I=n+1;}

                        }

                        J++;                  }                }           }

}}

intjudge3(chars,chara)

{

    inti=1,j=1;

    while(ccrr2[i][0]!

=s)

        i++;

    while(ccrr1[0][j]!

=a)

        j++;

    if(crr[i][j]==3)

        return3;

    else

        if(crr[i][j]==2)

            return2;

        else

            if(crr[i][j]==1)

                return1;

            else

                return0;

}

voidprint(chars[],charSTR[][20],intq,intu,intii,intk)//打印归约的过程

{

    cout<

    for(inti=0;i<=k;i++)

        cout<

    cout<<"        ";

    for(i=q;i<=ii;i++)

      

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

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2