⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 编译原理-算符优先.c

📁 一个程序
💻 C
📖 第 1 页 / 共 2 页
字号:

                                        printf("firstvt:%c      ",vnname[i].name);
                                            printf("{");
                                          for(j=0;j<15;j++)
                                                    {    if(vnname[i].value[j]!=0)
                                                       printf("%c,",vnname[i].value[j]);
                                                    }
                                                    printf("}");
                                                        printf("\n");
                                                     }}


                                        }//lastkuohao

                             //#####################################################################

                                                 void last()//计算lastvt
                                                 {

                                                    int i,j,k,sign=0,v,a,h,c=0;
                                  int r;   int la;




                                  ///kaishi
                                  for(i=0;i<num;i++)
                                  {
                                    lastvt[i].name=expr[i].vn;
                                       for(j=0;j<15;j++)   {
                                          la=j+1;
                                  //求出zuihou一个是终结符的表达式的
                                  for(k=0;k<15;k++)
                                  {
                                  if((expr[i].vright[j]==vt[k])&&(expr[i].vright[j+1]==0) &&(vt[k]!=0))
                                   {

                                     lastvt[i].value[0] =vt[k];



                                  }           //     求出第一个是终结符的表达式的,结束
                                  
                                  


                                  if ((expr[i].vright[j]==vn[k])&&(expr[i].vright[la]==0)&&(vn[k]!=0) )
                                        {


                                         lastvt[i].value[0] =expr[i].vright[j-1];
                                  }   //qiu第二个是终结符的


                                        if((expr[i].vright[0]==vn[k])&&(expr[i].vright[1]==0))
                                        {
                                      lastvt[i].value[0] =vn[k];
                                            } //  qiu 右部只有一个非终结符的
                                            

                                  }
                                  } }   // for的括号
                                  



                                           k=1;
                                      //last[0].lastname=vnname[0];
                                  for(i=0;i<num;i++)
                                  {

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

                                   {       //if()
                                         if((lastvt[i].name==lastvt[j].name)&&(i!=j))
                                  {       lastvt[i].value[k]=lastvt[j].value[0];
                                         k++;

                                         }
                                    }
                                }
                                
                                


                                //唯一化

                                    for(i=0;i<num;i++)
                                    {for(j=0;j<num;j++)
                                    { if((lastvt[i].name==lastvt[j].name)&&(i<j))
                                              lastvt[j].name=0;
                                              }}

                                              //rightvn's
                                     for(i=0;i<num;i++)
                                    {for(j=0;j<num;j++)
                                    { if((rightvnlast[i]==rightvnlast[j] )&&(i<j))
                                              rightvnlast[j]=0;
                                              }}

                              BB:
                                 sign5=0;
                                     for(i=0;i<num;i++)  {
                                  for(j=0;j<num;j++)
                                    {
                                     if((lastvt[i].name==rightvnlast[j])&&(rightvnlast[j]!=0))
                                       {
                                        for(k=0;k<15;k++){
                                       for(v=0;v<num;v++){
                                       if((lastvt[i].value[k]==vn[v])&&(vn[v]!=0))
                                    {mysign1=1; }  }  }

                                    if(mysign1==0)
                                    {candolast[c].name=lastvt[i].name;
                                    for(a=0;a<num;a++)
                                    {if(lastvt[i].value[a]!=0)
                                    {candolast[c].value[a]=lastvt[i].value[a];

                                     }}
                                    r=c;
                                    c++;}
                                         for(h=0;h<num;h++){
                                         if((rightvnlast[h]==candolast[r].name)&&(rightvnlast[h]!=0))
                                         rightvnlast[h]=0;}
                                    mysign1=0; }}
                                          }


                                    for(i=0;i<num;i++){
                                    for(j=0;j<15;j++)
                                    {  for(k=0;k<num;k++){
                                    if((lastvt[i].value[j]==candolast[k].name)&&(candolast[k].name!=0))
                                    {   sign4=1;
                                        }

                                     if(sign4==1){
                                     for(a=0;a<15;a++){
                                     if  (candolast[k].value[a]!=0) {
                                     for(h=0;h<15;h++)  {
                                      if((lastvt[i].value[h]==candolast[k].name)||(lastvt[i].value[h]==0))
                                        {lastvt[i].value[h]=candolast[k].value[a];
                                        break;}}  } }
                                         }
                                         sign4=0;
                                    }}                    }

                                       for(h=0;h<num;h++){
                                       if(rightvnlast[h]!=0)
                                       sign5=1;}
                                         if(sign5==1)    goto BB;
                                         
                                         //将lastvt唯一化
                                            for(i=0;i<num;i++)
                                    {for(j=0;j<num;j++)
                                    for(k=0;k<15;k++){
                                    { if((lastvt[i].value[j]==lastvt[i].value[k])&&(j<k))
                                              lastvt[i].value[k]=0;
                                              }}       }


                                                       printf("***************************输出lastvt:******************************\n");

                                   for(i=0;i<num;i++)
                                   {if(lastvt[i].name!=0){

                                        printf(" lastvt:%c      ",lastvt[i].name);
                                             printf("{");
                                          for(j=0;j<15;j++)
                                                    {    if(lastvt[i].value[j]!=0)
                                                       printf("%c , ",lastvt[i].value[j]);
                                                    }
                                                    printf("}");
                                                        printf("\n");
                                                     }}

                                              }
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                                 //判定文法是否为算符优先文法
                                              //,如是,生成算符优先关系表
                                              
                                              void table()
                                              {   int i,j,k,v,h,w,a;
                                              int b,c;
                                              //table 初始花
                                                     for(h=0;h<tablenum;h++){

                                                      {

                                              fuhaotable[0][h+1]=newvt[h];
                                               fuhaotable[h+1][0]=newvt[h];}
                                                 }

                                              
                                              for(i=0;i<num+1;i++)
                                              {
                                              for(j=0;j<15;j++)
                                              {for(k=0;k<num+1;k++)
                                              {  for(v=0;v<tablenum+1;v++)
                                              {//如果右部只有一个非终结符
                                               if((expr[i].vright[j]==vn[k])&&(expr[i].vright[j+1]==0)&&(vn[k]!=0)&&(j==0));
                                               //如果右部只有一个终结符
                                               if((expr[i].vright[j]==vn[k])&&(expr[i].vright[j+1]==0)&&(vn[k]!=0)&&(j==0));
                                               // 求出“〉”关系的

                                               if((expr[i].vright[j]==lastvt[k].name)&&(expr[i].vright[j+1]==newvt[v])&&(lastvt[k].name!=0)&&(newvt[v]!=0))
                                               {for(h=0;h<tablenum+1;h++){

                                                                    for(a=0;a<15;a++){

                                                                  if((fuhaotable[h][0]==lastvt[k].value[a])&&(lastvt[k].value[a]!=0))
                                                                  {  for(w=0;w<tablenum+1;w++)
                                                                  {if((fuhaotable[0][w]==newvt[v])&&(newvt[v]!=0))
                                                                      {
                                                                      if(fuhaotable[h][w]==0)


                                                                      fuhaotable[h][w]='>';
                                                                      else {printf("本文法不是算符优先文法!!");
                                                                     goto END;}
                                                                    }
                                                                  }
                                                                  }      //  }
                                                     }}
                                                     }
                                       //
                                                        //求出“<”关系的
                                                          //

                                                        //
                                                    if((expr[i].vright[j]==vnname[k].name)&&(expr[i].vright[j-1]==newvt[v])&&(vnname[k].name!=0)&&(newvt[v]!=0)&&(j!=0))
                                                     {for(h=0;h<tablenum+1;h++){


                                                                    if((fuhaotable[h][0]==newvt[v])&&(newvt[v]!=0))
                                                                  {
                                                                   for(w=0;w<tablenum+1;w++)
                                                                   {        for(a=0;a<15;a++)
                                                                   {
                                                                     if((fuhaotable[0][w]==vnname[k].value[a])&&(vnname[k].value[a]!=0))
                                                                        {
                                                                       if(fuhaotable[h][w]==0)
                                                                      fuhaotable[h][w]='<';
                                                                    else {printf("本文法不是算符优先文法!!");
                                                                   goto END;}
                                                                          }
                                                                  }
                                                                  }
                                                     }}
                                                     }
                                                         //求出"="关系的
                                                         if((expr[i].vright[j]==newvt[v])&&(expr[i].vright[j+2]==newvt[k])&&(newvt[k]!=0)&&(newvt[v]!=0))
                                                       {for(h=0;h<tablenum+1;h++){

                                                                //   for(a=0;a<15;a++)
                                                                  {  if((fuhaotable[h][0]==newvt[v])&&(newvt[v]!=0))
                                                                  {
                                                                   for(w=0;w<tablenum+1;w++)
                                                                   {
                                                                     if((fuhaotable[0][w]==newvt[k])&&(newvt[k]!=0))
                                                                         {
                                                                         if(fuhaotable[h][w]==0)
                                                                      fuhaotable[h][w]='=';
                                                                     else {printf("本文法不是算符优先文法!!");
                                                                     goto END;}

                                                                        }
                                                                  }
                                                                  }
                                                     }}
                                                     }
                                                    
                                                    
                                              }}} } //for de

                                             //output
                                             printf("############################得到算符优先关系表如下:#########################\n ");
                                                      for(h=0;h<tablenum+1;h++){
                                                     for(w=0;w<tablenum+1;w++) {


                                         printf("  %c  ",fuhaotable[h][w] ) ;}
                                         printf("\n-------------------------------------------------\n");
                                                 }
                                                    END:;
                                              }   //table 的括号

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -