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

📄 cifafenxi.cpp

📁 SLR(0)语法分析的简单赋值语句的翻译程序,含词法分析,共800行
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  case 1303:
  case 1307:
  case 1308:
	  tempstr1=outputstack.top();
      outputstack.pop();
      tempstr2=outputstack.top();
      outputstack.pop();
	  m_out<<"+"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
	  cout<<"\t\t\t\t\t"<<"+"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
      outputstack.push(*(tempstring.end()-1));
	  tempstring.erase((tempstring.end()-1));
	  sysm_stack.pop();
      sysm_stack.pop();
	  sysm_stack.pop();
	  sysm_stack.push(pair<char,string>('E',""));
      status_stack.pop();
	  status_stack.pop();
	  status_stack.pop();
	  status_stack.push(gotofind(status_stack.top()*100+setchartoint('E')));
      return 2;
  case 1402:
  case 1403:
  case 1407:
  case 1408:
	  tempstr1=outputstack.top();
      outputstack.pop();
      tempstr2=outputstack.top();
      outputstack.pop();
	  m_out<<"-"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
	  cout<<"\t\t\t\t\t"<<"-"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
      outputstack.push(*(tempstring.end()-1));
	  tempstring.erase((tempstring.end()-1));
	  sysm_stack.pop();
      sysm_stack.pop();
	  sysm_stack.pop();
	  sysm_stack.push(pair<char,string>('E',""));
      status_stack.pop();
	  status_stack.pop();
	  status_stack.pop();
	  status_stack.push(gotofind(status_stack.top()*100+setchartoint('E')));
      return 2;
  case 1502:
  case 1503:
  case 1504:
  case 1505:
  case 1507:
  case 1508:
	  tempstr1=outputstack.top();
      outputstack.pop();
      tempstr2=outputstack.top();
      outputstack.pop();
	  m_out<<"*"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
	  cout<<"\t\t\t\t\t"<<"*"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
      outputstack.push(*(tempstring.end()-1));
	  tempstring.erase((tempstring.end()-1));
	  sysm_stack.pop();
      sysm_stack.pop();
	  sysm_stack.pop();
	  sysm_stack.push(pair<char,string>('T',""));
      status_stack.pop();
	  status_stack.pop();
	  status_stack.pop();
	  status_stack.push(gotofind(status_stack.top()*100+setchartoint('T')));
      return 2;
  case 1602:
  case 1603:
  case 1604:
  case 1605:
  case 1607:
  case 1608:
	  tempstr1=outputstack.top();
      outputstack.pop();
      tempstr2=outputstack.top();
      outputstack.pop();
	  m_out<<"/"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
	  cout<<"\t\t\t\t\t"<<"/"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
      outputstack.push(*(tempstring.end()-1));
	  tempstring.erase((tempstring.end()-1));
	  sysm_stack.pop();
      sysm_stack.pop();
	  sysm_stack.pop();
	  sysm_stack.push(pair<char,string>('T',""));
      status_stack.pop();
	  status_stack.pop();
	  status_stack.pop();
	  status_stack.push(gotofind(status_stack.top()*100+setchartoint('T')));
      return 2;
  case 1702:
  case 1703:
  case 1704:
  case 1705:
  case 1707:
  case 1708:
	  sysm_stack.pop();
      sysm_stack.pop();
	  sysm_stack.pop();
	  sysm_stack.push(pair<char,string>('F',""));
      status_stack.pop();
	  status_stack.pop();
	  status_stack.pop();
	  status_stack.push(gotofind(status_stack.top()*100+setchartoint('F')));
      return 2;
  case 308:
	  tempstr1=outputstack.top();
      outputstack.pop();
      outputstack.pop();
	  tempstr2=outputstack.top();
	  outputstack.pop();
	  m_out<<"="<<"\t"<<tempstr1<<"\t"<<"\t"<<tempstr2<<endl;
	  cout<<"\t\t\t\t\t"<<"="<<"\t"<<tempstr1<<"\t"<<"\t"<<tempstr2<<endl;
	  return 0;
  }
}

bool identify(list<pair<char,string> > listsource)
{
 stack<int>status_stack;
 stack<pair<char,string> >sysm_stack;
 char ch[2];
 int i,j,t,k,v;
 ch[1]=0;
 pair<char,string> tempstr;
 sysm_stack.push(pair<char,string>(';',""));
 stack<int> tempstatus_stack;
 stack<pair<char,string> > tempsysm_stack;
 stack<string> outputstack;
 ofstream m_out;
 m_out.open("4yuabshi.txt");
 if(!m_out.is_open())
     cout<<"can't create 4yuanshi.txt;\n";
 vector<string> tempstring;
   for(j = 90;j != 64; --j)
   {  
	   ch[0]=char(j);
      tempstring.push_back(ch);
   }
 list<pair<char,string> >::iterator listiter;
 for(listiter=listsource.begin();listiter!=listsource.end();++listiter)
 {
	 cout<<"\t"<<listiter->first<<endl;
 }
 status_stack.push(0);
 for(listiter=listsource.begin();;)
 {   
     v=status_stack.size();
	 for(k=0;k<v;k++)
	 {
		 i=status_stack.top();
	     tempstatus_stack.push(i);
		 status_stack.pop();
	 }
	 
     for(k=0;k<v;k++)
	 {
		 i=tempstatus_stack.top();
		 cout<<left<<i;
	     status_stack.push(i);
		 tempstatus_stack.pop();
	 }
	 cout<<"\t\t";
	 v=sysm_stack.size();
	 for(k=0;k<v;k++)
	 {
		 tempstr=sysm_stack.top();
	     tempsysm_stack.push(tempstr);
		 sysm_stack.pop();
	 }
	 
	 for(k=0;k<v;k++)
	 {
		 tempstr=tempsysm_stack.top();
		 cout<<left<<tempstr.first;
	     sysm_stack.push(tempstr);
		 tempsysm_stack.pop();
	 }
	 cout<<"\t\t";
     i=status_stack.top();
	 list<pair<char,string> >::iterator listiter1;
     cout<<right;
	 list<pair<char,string> > listsource1;
	 copy(listiter,listsource.end(),back_insert_iterator<list<pair<char,string> > >(listsource1));
     for(listiter1=listsource1.begin();listiter1!=listsource1.end();++listiter1)
		cout<<listiter1->first;
	 cout<<endl;
	 j=setchartoint(listiter->first);
	 if(j==-1)
		 return false;
	 if(actionAndgoto[i][j])
	 {  
		 t=100*i+j;
         pair<char,string> pp(listiter->first,listiter->second);
		 k=doforpush(status_stack,sysm_stack,outputstack,tempstring,t,&pp,m_out);
		 if(k==1)
		 {
			 ++listiter;
		     continue;
		 }
         else if(k==2)
		     continue;
         else
			 return true;
	 }
	 else
         return false;
 }
}
// main function
void main()
{
cllist l1;
l1=(cllist) malloc(sizeof(cl));
bllist l2;
l2=(bllist) malloc(sizeof(bl));
clcreatlist(l1);
blcreatlist(l2);
FILE *in,*out,*table;
char str[MAX];
float sum,x=1;
char in_char;
int i=0,a,l;
if((in=fopen("infile.txt","r"))==NULL)
{
 printf("can not open file\n");
 exit(0);
}
if((out=fopen("outfile.txt","w"))==NULL)
{
 printf("cannout open outfile\n");
    exit(1);
}
if((table=fopen("table.txt","w"))==NULL)
{
 printf("cannout open outfile\n");
    exit(1);
}
in_char=fgetc(in);
while(!feof(in))
{
 x=1;
 while(in_char==' '||in_char=='	')
 { 
     in_char=fgetc(in);
 }
 if(feof(in))
	 break;
 else if((in_char>='a'&&in_char<='z')||(in_char>='A'&&in_char<='Z')||(in_char>='0'&&in_char<='9')||check1(in_char,&a)||check2(in_char,&a)||in_char=='\n'||in_char=='\r')
 {
  if(in_char>='0'&&in_char<='9')
  {
    sum=float(int(in_char)-48);
    in_char=fgetc(in);
      while(in_char>='0'&&in_char<='9')
        {
          sum*=10;
		  sum+=int(in_char)-48;
          in_char=fgetc(in);
        }
      if(in_char!='.')
       {
		  if(clfind(l1,sum,&a,&l))
          fprintf(out,"%d,%d%s",l,a,"\n");
		  else
		  {
			  cllistinsert(l1,sum);
              clfind(l1,sum,&a,&l);
              fprintf(out,"%d,%d%s",l,a,"\n");
		  }
       }
      else
       {
          in_char=fgetc(in);
          while(in_char>='0'&&in_char<='9')
		  {
             x=x/10;
			 sum=sum+x*(int(in_char)-48);
             in_char=fgetc(in);
		  }
          if(clfind(l1,sum,&a,&l))
          fprintf(out,"%d,%d%s",l,a,"\n");
		  else
		  {
			  cllistinsert(l1,sum);
              clfind(l1,sum,&a,&l);
              fprintf(out,"%d,%d%s",l,a,"\n");
		  }
       }
  }
   else if((in_char>='a'&&in_char<='z')||(in_char>='A'&&in_char<='Z'))
   {
    i=0;
	str[i++]=in_char;
	in_char=fgetc(in);
    while((in_char>='a'&&in_char<='z')||(in_char>='0'&&in_char<='9')||(in_char>='A'&&in_char<='Z')||in_char=='_')
    {
      str[i++]=in_char;
      in_char=fgetc(in);
    }
    str[i++]='\0';
	if(check3(str,&a))
	   fprintf(out,"%d,%d%s",guanbao[a].leibie,guanbao[a].add,"\n");	
    else if(blfind(l2,str,&a,&l))
          fprintf(out,"%d,%d%s",l,a,"\n");
    	else
		{
			  bllistinsert(l2,str,i);
             blfind(l2,str,&a,&l);
              fprintf(out,"%d,%d%s",l,a,"\n");
		}
   }
   else if(check1(in_char,&a))
          if(in_char=='/')
		  { 
			  in_char=fgetc(in);
              if(in_char=='/')
			  {
				  while(in_char!='\n')
                  in_char=fgetc(in);
                  in_char=fgetc(in);
			  }
			  else
                  fprintf(out,"%d,%d%s",wordyun[a].leibie,wordyun[a].add,"\n");
		  }
		   else
		   {
			   fprintf(out,"%d,%d%s",wordyun[a].leibie,wordyun[a].add,"\n");	
               in_char=fgetc(in);
		   }
   else if(check2(in_char,&a))
   {
		   fprintf(out,"%d,%d%s",wordjie[a].leibie,wordjie[a].add,"\n");	
           in_char=fgetc(in);
   }
   while(in_char=='\n'||in_char=='\r')
   {
      in_char=fgetc(in);
   }
 }
else
{
    fprintf(out,"%s,%c%c%c%c","error",'"',in_char,'"','\n');
    in_char=fgetc(in);
}
}
fprintf(table,"%d%s",1,".关键字\n");
for(i=0;i<32;i++)
    fprintf(table,"%s%d,%s%s","(",guanbao[i].add,guanbao[i].zifu,")\n");
fprintf(table,"%c%d%s",'\n',2,".运算符\n");
for(i=0;i<20;i++)
    fprintf(table,"%s%d,%c%s","(",wordyun[i].add,wordyun[i].suan,")\n");
fprintf(table,"%c%d%s",'\n',3,".界符\n");
for(i=0;i<7;i++)
    fprintf(table,"%s%d,%c%s","(",wordjie[i].add,wordjie[i].jie,")\n");
fprintf(table,"%c%d%s",'\n',4,".常量\n");
cllist p;
p=l1->next;
 while(p)
 {
  fprintf(table,"%s%d,%f%s","(",p->add,p->data,")\n");
  p=p->next;
 }
fprintf(table,"%c%d%s",'\n',5,".标识符\n");
bllist q;
q=l2->next;
 while(q)
 {
  fprintf(table,"%s%d,%s%s","(",q->add,q->name,")\n");
  q=q->next;
 }
fclose(in);
fclose(out);

ifstream m_in;
m_in.open("outfile.txt");
if(!m_in.is_open())
cout<<"can't open outfile.txt;\n";
//cout<<m_in.rdbuf();
list<pair<char,string> > listsource;
string m_str,strstr;
while(getline(m_in,m_str))
{
	int local=m_str.find(',');
	strstr=xbfind((int)strtofloat1(m_str.substr(0,local)),(int)strtofloat1(m_str.substr(local+1,m_str.size()-local-1)),l1,l2,guanbao,wordyun,wordjie);
	cout<<strstr;
	switch((int)strtofloat1(m_str.substr(0,local)))
	{
	    case 1:
			break;
		case 2:
			listsource.push_back(pair<char,string>(wordyun[(int)strtofloat1(m_str.substr(local+1,m_str.size()-local-1))].suan,strstr));
			break;
		case 3:
			listsource.push_back(pair<char,string>(wordjie[(int)strtofloat1(m_str.substr(local+1,m_str.size()-local-1))].jie,strstr));
			break;
		case 4:
		case 5:
            listsource.push_back(pair<char,string>('i',strstr));
			break;
	}
}
cout<<endl;
//string strsource="i=i+i*(i-i/i);";
//cout<<strsource<<endl;

if(identify(listsource))
{
	cout<<"success!"<<endl;
}
else
    cout<<"error!"<<endl;
m_in.close();
}

⌨️ 快捷键说明

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