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

📄 suanfuyouxian.cpp

📁 一个简单的语法分析~~~使用了算符优先来分析
💻 CPP
字号:
#include<iostream>
using namespace std;
int tpd1(char a)
{
    int x;
	char T[8]={'+','-','*','/','(',')','i','#'};
    for(x=0;x<8;x++)
    { 
         if(a==T[x])
         {
              return x;
              break;
         }
    }
	if(x==8)
	{
		return 0;
	}
}
char tpd2(char a)
{
    char T[8]={'+','-','*','/','(',')','i','#'};
    for(int x=0;x<8;x++)
    { 
         if(a==T[x])
         {
              break;
         }
    }
    if(x==8)
    {
         return 'N';
    }
    else
    {
         return 'Y';
    }
}
char npd(char a)
{
    char N[3]={'E','T','F'};
    for(int x=0;x<3;x++)
    { 
         if(a==N[x])
         {
              break;
         }
    }
    if(x==3)
    {
         return 'N';
    }
    else
    {
         return 'Y';
    }
}
int pdyx(int i,int j)
{
    char T[8]={'+','-','*','/','(',')','i','#'};
    char FF[8]={"(i"};
    char LF[8]={")i"};
    char FT[8]={"*/(i"};
    char LT[8]={"*/)i"};
    char FE[8]={"+-*/(i"};
    char LE[8]={"+-*/)i"};
    switch(T[i])
    {
         case '+':

         case '-':
			int m;
            for(m=0;;m++)
            {
                 if(!FT[m])
                 {
                      break;
                 }
                 if(T[j]==FT[m])
                 {
                      return 1;
                      break;
                 }
            }
            break;
         case '*':

         case '/':
			 int k;
            for(k=0;;k++)
            {
                 if(!FF[k])
                 {
                      break;
                 }
                 if(T[j]==FF[k])
                 {
                      return 1;
                      break;
                 }
            }
            break;
         case '(':
			 int y;
            for(y=0;;y++)
            {
                 if(!FE[y])
                 {
                      break;
                 }
                 if(T[j]==FE[y])
                 {
                      return 1;
                      break;
                 }
            }
            break;
         case ')':
            break;
         case 'i':
            break;
         case '#':
            return 1;
            break;
         default:
            break;
    }
    switch(T[j])
    {
         case '+':

         case '-':
			int t;
            for(t=0;;t++)
            {
                 if(!LE[t])
                 {
                      break;
                 }
                 if(T[i]==LE[t])
                 {
                      return 2;
                      break;
                 }
            }
            break;
         case '*':

         case '/':
			 int x;
            for(x=0;;x++)
            {
                 if(!LT[x])
                 {
                      break;
                 }
                 if(T[i]==LT[x])
                 {
                      return 2;
                      break;
                 }
            }
            break;
         case '(':
            break;
         case ')':
			 int n;
            for(n=0;;n++)
            {
                 if(!LE[n])
                 {
                      break;
                 }
                 if(T[i]==LE[n])
                 {
                      return 2;
                      break;
                 }
            }
            break;
         case 'i':
            break;
         case '#':
            return 2;
            break;
         default:
            break;
    }
}

void main()
{
    char a[20];
    char T[8]={'+','-','*','/','(',')','i','#'};
    int jz[8][8];//3代表优先级相同,2代表前者优先级高于后者,1代表前者低于后者
    cout<<"根据F-->(E)|i可知\nFIRSTVT(F)={(,i}   LASTVT(F)={),i}\n根据T-->T*F|T/F|F可知\nFIRSTVT(T)={*,/,(,i}   LASTVT(F)={*,/,),i}\n根据E-->E+T|E-T|T可知\nFIRSTVT(E)={+,-,*,/,(,i}   LASTVT(E)={+,-,*,/,),i}\n\n\n"<<endl;
    for(int x=0;x<8;x++)
    {
        for(int y=0;y<8;y++)
        {
             if((x==4&&y==7)||(x==5&&(y==4||y==6))||(x==6&&(y==4||y==6))||(x==7&&y==5))
             {
                 continue;
             }
             if((x==4&&y==5)||(x==7&&y==7))
             {
                 jz[x][y]=3;
                 continue;
             }
             jz[x][y]=pdyx(x,y);
        }
    }
    cout<<"     ";
    for(int e=0;e<8;e++)
    {
        cout<<"  "<<T[e]<<"  ";
    }
    cout<<endl;
    for(int d=1;d<9;d++)
    {
        cout<<"  "<<T[d-1]<<"  ";
        for(int y=1;y<9;y++)
        {
            switch(jz[d-1][y-1])
            {
                 case 1:
                        cout<<"  <  ";
                        break;
                 case 2:
                        cout<<"  >  ";
                        break;
                 case 3:
                        cout<<"  =  ";
                        break;
                default:
                        cout<<"     ";
                        break;
            }
        }
        cout<<endl;
    }
	cout<<"\n\n\n"<<endl;
    cout<<"输入测试串(以#结束):"<<endl;
    cin>>a;
	cout<<"\n\n"<<endl;
    char S[20];
    S[0]='#';
    S[1]=NULL;
    int i=0,j=0;
    int c=1;
	int g=0;
	int l;
    while(a[j])
    {
		if(c<10)
		{
            cout<<"   "<<c<<"     ";
		}
		if(c>9)
		{
			cout<<"   "<<c<<"    ";
		}
		c++;
        for(int x=0;;x++)
        {
            if(!S[x])
            {
                break;
            }
            cout<<S[x];
        }
		for(l=i;l<11;l++)
		{
			cout<<" ";
		}
        int h;
        char b;
        if(tpd2(S[i])=='Y')
        {
            h=i;
        }
        else
        {
            h=i-1;
        }
        if(jz[tpd1(S[h])][tpd1(a[j])]==2)
        {
            cout<<"       >      "<<a[j]<<"      ";
			for(l=0;l<=j;l++)
			{
				cout<<" ";
			}
            for(int x=j+1;;x++)
            {
                if(!a[x])
                {
                     break;
                }
                cout<<a[x];
            }
            while(1)
            {
                b=S[h];
                if(tpd2(S[h-1])=='Y')
                {
                    h=h-1;
                }
                else
                {
					h=h-2;
                }
                if(jz[tpd1(S[h])][tpd1(b)]==1)
                {
                    int p=i-h;
                    char ls[20];
                    int t=h;
                    for(int s=0;s<p;s++)
                    {
                        ls[s]=S[++t];
                    }
                    ls[p]=NULL;                    
                    char gyx[13][4]={{"E+T"},{"E-T"},{"T"},{"T*F"},{"T/F"},{"F"},{"(E)"},{"i"},{"F+F"},{"F-F"},{"F*F"},{"F/F"},{"(F)"}};
					int x;
                    for(x=0;x<13;x++)
                    {
                         int y=0,z=0;
                         while(gyx[x][y]&&ls[z])
                         {
                              if(gyx[x][y]==ls[z])
                              {
                                   y++;
                                   z++;
                                   continue;
                              }
                              else
                              {
                                   break;
                              }
                          }
                          if((!ls[z])&&(!gyx[x][y]))
                          {
                               i=h+1;
                               if((x==0)||(x==1)||(x==2))
                               {
                                    S[i]='E';
									cout<<"        规约    "<<endl;
                               }
                               if((x==3)||(x==4)||(x==5))
                               {
                                    S[i]='T';
									cout<<"        规约    "<<endl;
                               }
                               if((x==6)||(x==7)||(x==8)||(x==9)||(x==10)||(x==11)||(x==12))
                               {
                                    S[i]='F';
									cout<<"        规约    "<<endl;
                               }
                               S[i+1]=NULL;
                               break;
                          }
                          else
                          {
                               continue;
                          }
                     }
					if(x==13)
					{
						g=1;
						cout<<"        失败    \n"<<endl;
						cout<<"规约失败,不可接受"<<endl;
					}
                     break;
                }
                else
                {
                     continue;
                }
            }
        }
        else
        {
            if(jz[tpd1(S[h])][tpd1(a[j])]==1)
            {
                cout<<"       <      "<<a[j]<<"      ";
				for(l=0;l<=j;l++)
				{
					cout<<" ";
				}
                for(int x=j+1;;x++)
				{
                    if(!a[x])
					{
                         break;
					}
                    cout<<a[x];
				}
                 cout<<"        移进    "<<endl;
                 i=i+1;
                 S[i]=a[j];
                 j++;
                 S[i+1]=NULL;
                 continue;
            }
            else
            {
                 if(jz[tpd1(S[h])][tpd1(a[j])]==3)
                 {
                      char n='#';
                      if(jz[tpd1(S[h])][tpd1(n)]==3)
                      {
                           if(npd(S[h+1])=='Y'&&a[j]=='#')
                           {
                                cout<<"       =      "<<a[j]<<"      ";
								for(l=0;l<=j;l++)
								{
									cout<<" ";
								}
                                for(int x=j+1;;x++)
                                {
                                     if(!a[x])
                                     {
                                          break;
                                     }
                                     cout<<a[x];
                                }
                                cout<<"        接受    \n"<<endl;
                                cout<<"规约成功,可接受"<<endl;
                                break;
                           }
                           else
                           {
                                cout<<"              "<<a[j]<<"      ";
								for(l=0;l<=j;l++)
								{
									cout<<" ";
								}
                                for(int x=j+1;;x++)
                                {
                                     if(!a[x])
                                     {
                                          break;
                                     }
                                cout<<a[x];
                                }
                                cout<<"        失败    \n"<<endl;
                                cout<<"规约失败,不可接受"<<endl;
                                break;
                           }
                      }
                      else
                      {
                           cout<<"       =      "<<a[j]<<"      ";
						   for(l=0;l<=j;l++)
						   {
							   cout<<" ";
						   }
                           for(int x=j+1;;x++)
                           {
                               if(!a[x])
							   {
                                   break;
							   }
                               cout<<a[x];
                           }
                           cout<<"        移进    "<<endl;
                           i=i+1;
                           S[i]=a[j];
                           j++;
                           S[i+1]=NULL;
                           continue;
                      }
				 }
                 else
                 {
                      cout<<"              "<<a[j]<<"      ";
					  for(l=0;l<=j;l++)
					  {
						  cout<<" ";
					  }
                      for(int x=j+1;;x++)
                      {
                           if(!a[x])
                           {
                              break;
                           }
                           cout<<a[x];
                      }
                      cout<<"        失败    \n"<<endl;
                      cout<<"规约失败,不可接受"<<endl;
                      break;
                 }
            }
       }
		if(g==1) break;
		//if(a[j]=='#') break;
    }
}

⌨️ 快捷键说明

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