这个语法分析器错在哪里?

#include<iostream>
using namespace std;
#define MAXSIZE 100

typedef struct
{
 char *base;
 char *top;
 int size;
}sqstack;

typedef struct
{
 char t;
 int number;
}zongheti;
zongheti a[8];

typedef struct
{
 char m;
 char *p;
}wf;
wf wenfa[20][20];
char zanshi[20];
int max=0;
int k;

void initstack(sqstack &s)
{
 s.base=(char *)malloc(MAXSIZE*sizeof(char));
 s.size=MAXSIZE;
 s.top=s.base;
}

int data[9][9]=
{
     1,1,-1,-1,-1,-1,1,1,
  1,1,-1,-1,-1,-1,1,1,
  1,1,1,1,-1,-1,1,1,
  1,1,1,1,-1,-1,1,1,
  1,1,1,1,-1,-1,1,1,
  1,1,1,1,2,2,1,1,
  -1,-1,-1,-1,-1,-1,0,2,
  1,1,1,1,2,2,1,1,
  -1,-1,-1,-1,-1,-1,2,0
};

int feizhongjie(char t)
{
 if(t<='Z'&&t>='A')
 return 1;
 else
  return 0;
}

void push(sqstack &s,char t)
{
 *s.top=t;
 s.top++;
}

char pop(sqstack &s)
{
 char t;
 t=*(s.top--);
 return t;
}
char gettop(sqstack &s)
{
 char t;
 t=*(s.top-1);
 return t;
}

void guiyue(sqstack &s,char *p)
{
 int i=0,j=0;
 char *q;
 q=p;
 while(p<s.top)
 {
  zanshi[i]=*p;
  p++;
  i++;
 }
 zanshi[i]='/0';
 s.top=q;
 for(i=0;i<k;i++)
  for(j=0;j<max;j++)
 
   if(!strcmp(wenfa[i][j].p,zanshi))
   {push(s,wenfa[i][j].m);
       break;
   }
}
int main()
{
 sqstack s;
 initstack(s);
 a[0].t='+';
 a[0].number=1;
 a[1].t='-';
 a[1].number=2;
 a[2].t='*';
 a[2].number=3;
 a[3].t='/';
 a[3].number=4;
 a[4].t='i';
 a[4].number=5;
 a[5].t='(';
 a[5].number=6;
 a[6].t=')';
 a[6].number=7;
 a[7].t='$';
 a[7].number=8;
 int i,j,n;
 char *p,*t;
 char str[20][20];
 char string[20];
 cout<<"输入文法规则数"<<endl;
 cin>>k;
 cout<<"请输入相应的文法规则"<<endl;
    for(i=0;i<k;i++)
  cin>>str[i];
 for(i=0;i<k;i++)
 {
    n=0;
   for(j=0;j!='/n';j++)
     if(str[i][j]=='|')
    n++;
        if(max<n)
    max=n;
 }
 for(i=0;i<k;i++)
  for(j=0;j<max;j++)
  {
   wenfa[i][j].m='N';
   wenfa[i][j].p=(char*)malloc(20*sizeof(char));
   *wenfa[i][j].p='/0';
  
  }
    
 for(i=0;i<k;i++)
 {
         
   if(feizhongjie(str[i][0]))
   {
      str[i][0]='N';
      n=0;
      j=1;
      t=wenfa[i][n].p;
    }
         else
   {
    cout<<"不合法"<<endl;
    return -1;
   }
    for(j=1;str[i][j]!=';';j++)
  {
   
   if(feizhongjie(str[i][j]))
   {
    str[i][j]='N';
                *(wenfa[i][n].p)=str[i][j];
       wenfa[i][n].p++;
   }
   else
   {
    if(str[i][j]!='|'&&str[i][j]!='-'&&str[i][j]!='>')
    {
     *(wenfa[i][n].p)=str[i][j];
     wenfa[i][n].p++;
    }
    else
    {
     if(str[i][j]=='|')
     {
      *wenfa[i][n].p='/0';
      wenfa[i][n].p=t;
      n++;
      wenfa[i][n].m='N';
      t=wenfa[i][n].p;
      }
    }
   }
  }
  *wenfa[i][n].p='/0';
  wenfa[i][n].p=t;
 }
 cout<<"输入要分析的短语,按$结束:"<<endl;
 cin>>string;
 push(s,'$');
 i=0;
 int x=0,y=0;
 do
 {
     int z=0,b;
        if(feizhongjie(gettop(s)))
     p=s.top-2;
     else
     p=s.top-1;
  if(string[i]=='$'&&*p=='$')
  {
   cout<<"输入串是文法的一个句子"<<endl;
      return 0;
  }
  else
  {
   for(b=0;b<8;b++)
   {
    if(a[b].t==*p)
    {
     z++;
     y=a[b].number;
    }
    else
     if(a[b].t==string[b])
     {
      z++;
      x=a[b].number;
     }
    if(z==2)
     break;
   }
   if(data[x][y]==1||data[x][y]==0)
   {
    push(s,string[i]);
    i++;
    p=s.top-1;
   }
   else
    if(data[x][y]==-1)
    {
     p--;
     if(!feizhongjie(*p))
     {
      p++;
      guiyue(s,p);
      i++;
     }
        else
     {
      guiyue(s,p);
         i++;
     }
    }
    else
     return -1;
  }

 }while(1);
}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页