www.pudn.com > SLR(0).rar > cifafenxi.cpp


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MAX 50 
#define TRUE 1 
#define FALSE 0 
using namespace std; 
typedef struct cl{ 
    float data; 
	//float b; 
	//char c[80]; 
	int add; 
	int leibie; 
	struct cl* next; 
}*cllist; 
typedef struct bl{ 
    char *name; 
	int add; 
	int leibie; 
    struct bl* next; 
}*bllist; 
struct guanbaozi{ 
    char *zifu; 
	int add; 
	int leibie; 
}guanbao[32]={{"char",0,1},{"short",1,1},{"int",2,1},{"unsigned",3,1},{"long",4,1},{"float",5,1}, 
{"double",6,1},{"struct",7,1},{"union",8,1},{"void",9,1},{"enum",10,1},{"signed",11,1}, 
{"const",12,1},{"include",13,1},{"typedef",14,1},{"auto",15,1},{"register",16,1},{"static",17,1}, 
{"extern",18,1},{"break",19,1},{"case",20,1},{"continue",21,1},{"default",22,1},{"do",23,1},{"else",24,1}, 
{"for",25,1},{"goto",26,1},{"if",27,1},{"return",28,1},{"switch",29,1},{"while",30,1},{"sizeof",31,1}}; 
struct yunsuanfu{ 
	char suan; 
	int add; 
	int leibie; 
}wordyun[20]={{'+',0,2},{'-',1,2},{'/',2,2},{'*',3,2},{'%',4,2},{'=',5,2},{'>',6,2},{'<',7,2},{'^',8,2}, 
{'&',9,2},{'#',10,2},{'|',11,2},{'(',12,2},{')',13,2},{'[',14,2},{']',15,2},{'.',16,2},{'!',17,2},{'?',18,2},{':',19,2}}; 
struct jiefu{ 
	char jie; 
	int add; 
	int leibie; 
}wordjie[7]={{'{',0,3},{'}',1,3},{'"',2,3},{';',3,3},{',',4,3},{'\'',5,3},{'\\',6,3}}; 
 
int pretable[5][9]={ 
      {1,0,0,0,0,1,0,0,0}, 
      {0,1,1,0,0,0,1,1,1}, 
      {1,0,0,0,0,1,0,0,0}, 
      {0,1,1,1,1,0,1,1,1}, 
      {1,0,0,0,0,1,0,0,0}}; 
int d=-1,b=-1; 
void clcreatlist(cllist cll) 
{            
  cll->add=d; 
  cll->next=NULL; 
} 
int cllistinsert(cllist cll,float e) 
{   
   cllist p,s; 
   p=cll; 
   while (p->next)   
       p=p->next; 
   s=(cllist) malloc(sizeof(cl)); 
   s->data=e; 
   s->add=++d; 
   s->leibie=4; 
   s->next=p->next; 
   p->next=s; 
   return TRUE; 
} 
int clfind(cllist cll,float e,int *a,int *l) 
{ 
	cllist p; 
	p=cll->next; 
	while(p) 
	{ 
		if(e==p->data) 
		{ 
			*a=p->add; 
		    *l=p->leibie; 
			return TRUE; 
		} 
		p=p->next; 
	} 
	return  FALSE; 
} 
float clfind1(cllist cll,int a) 
{ 
	cllist p; 
	p=cll->next; 
	while(p) 
	{ 
		if(a==p->add) 
		{ 
			return p->data; 
		} 
		p=p->next; 
	} 
	return 0.0; 
} 
void blcreatlist(bllist bll) 
{            
  bll->next=NULL; 
  bll->name=NULL; 
  bll->add=b; 
} 
int bllistinsert(bllist bll,char* e,int i) 
{   
   bllist p,s; 
   p=bll; 
   while (p->next)   
       p=p->next; 
   s=(bllist) malloc(sizeof(bl)); 
   //s->name=e; 
   //int n=sizeof(e)/sizeof(char); 
   s->name=(char*)malloc(i*sizeof(char)); 
   //printf("%d",n); 
   //for(int j=0;jname[j]=e[j]; 
   strcpy(s->name,e); 
   s->add=++b; 
   s->leibie=5; 
   s->next=p->next; 
   p->next=s; 
   return TRUE; 
} 
int blfind(bllist bll,char* e,int *a,int *l) 
{ 
	bllist p; 
    p=bll->next; 
	while(p) 
	{ 
		if(!strcmp(p->name,e)) 
		{ 
			*a=p->add; 
		    *l=p->leibie; 
			return TRUE; 
		} 
		p=p->next; 
	} 
	return  FALSE; 
} 
string blfind1(bllist bll,int a) 
{ 
	bllist p; 
	p=bll->next; 
	while(p) 
	{ 
		if(a==p->add) 
		{ 
			return p->name; 
		} 
		p=p->next; 
	} 
	return ""; 
} 
int check1(char ch,int *a) 
{  
	int i; 
	for(i=0;i<20;i++) 
		if(wordyun[i].suan==ch) 
		{ 
			*a=i; 
			return TRUE; 
		} 
	return FALSE; 
} 
int check2(char ch,int *a) 
{  
	int i; 
	for(i=0;i<7;i++) 
		if(wordjie[i].jie==ch) 
		{ 
			*a=i; 
			return TRUE; 
		} 
     return FALSE; 
} 
int check3(char *ch,int *a) 
{  
	int i; 
	for(i=0;i<32;i++) 
		if(!strcmp(guanbao[i].zifu,ch)) 
		{ 
			*a=i; 
			return TRUE; 
		} 
	return FALSE; 
} 
 
string xbfind(int a,int b,cllist cll,bllist bll,guanbaozi *guanbao,yunsuanfu *wordyun,jiefu *wordjie) 
{ 
	char ch[2]; 
	float fl; 
	ch[1]=0; 
	switch(a) 
	{ 
	case 1: 
        return guanbao[b].zifu; 
	case 2: 
        ch[0]=wordyun[b].suan; 
        return ch; 
	case 3: 
		ch[0]=wordjie[b].jie; 
        return ch; 
	case 4: 
        fl=clfind1(cll,b); 
		char ch[6]; 
	    _gcvt(fl,6,ch); 
		return ch; 
	case 5: 
        return blfind1(bll,b); 
	} 
	return ""; 
} 
bool isstrnum(string str) 
{    
	int j=str.size(); 
	for(int i=0;i& status_stack,stack >& sysm_stack,stack& outputstack,vector &tempstring,int t,pair *str,ofstream &m_out) 
{  
  int i=0; 
  string tempstr,tempstr1,tempstr2; 
  switch(t) 
  { 
  case 100: 
	  status_stack.push(2); 
      sysm_stack.push(*str); 
      outputstack.push(str->second); 
	  return 1; 
  case 1: 
	  status_stack.push(1); 
      sysm_stack.push(*str); 
	  outputstack.push(str->second); 
	  return 1; 
  case 201: 
  case 601: 
  case 801: 
  case 901: 
  case 1001: 
  case 1101: 
	  status_stack.push(7); 
      sysm_stack.push(*str); 
	  return 1; 
  case 302: 
  case 1202: 
	  status_stack.push(8); 
      sysm_stack.push(*str); 
	  return 1; 
  case 303: 
  case 1203: 
	  status_stack.push(9); 
      sysm_stack.push(*str); 
	  return 1; 
  case 404: 
  case 1304: 
  case 1404: 
	  status_stack.push(10); 
      sysm_stack.push(*str); 
	  return 1; 
  case 405: 
  case 1305: 
  case 1405: 
	  status_stack.push(11); 
      sysm_stack.push(*str); 
	  return 1; 
  case 206: 
  case 606: 
  case 806: 
  case 906: 
  case 1006: 
  case 1106: 
	  status_stack.push(6); 
      sysm_stack.push(*str); 
	  return 1; 
  case 1207: 
	  status_stack.push(17); 
      sysm_stack.push(*str); 
	  return 1; 
  case 402: 
  case 403: 
  case 407: 
  case 408: 
	  sysm_stack.pop(); 
	  sysm_stack.push(pair('E',"")); 
      status_stack.pop(); 
	  status_stack.push(gotofind(status_stack.top()*100+setchartoint('E'))); 
	  return 2; 
  case 502: 
  case 503: 
  case 504: 
  case 505: 
  case 507: 
  case 508: 
	  sysm_stack.pop(); 
	  sysm_stack.push(pair('T',"")); 
      status_stack.pop(); 
	  status_stack.push(gotofind(status_stack.top()*100+setchartoint('T'))); 
	  return 2; 
  case 702: 
  case 703: 
  case 704: 
  case 705: 
  case 707: 
  case 708: 
	  tempstr=sysm_stack.top().second; 
      outputstack.push(tempstr); 
	  sysm_stack.pop(); 
	  sysm_stack.push(pair('F',"")); 
      status_stack.pop(); 
	  status_stack.push(gotofind(status_stack.top()*100+setchartoint('F'))); 
	  return 2; 
  case 1302: 
  case 1303: 
  case 1307: 
  case 1308: 
	  tempstr1=outputstack.top(); 
      outputstack.pop(); 
      tempstr2=outputstack.top(); 
      outputstack.pop(); 
	  m_out<<"+"<<"\t"<('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"<('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"<('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"<('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('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"< > listsource) 
{ 
 stackstatus_stack; 
 stack >sysm_stack; 
 char ch[2]; 
 int i,j,t,k,v; 
 ch[1]=0; 
 pair tempstr; 
 sysm_stack.push(pair(';',"")); 
 stack tempstatus_stack; 
 stack > tempsysm_stack; 
 stack outputstack; 
 ofstream m_out; 
 m_out.open("4yuabshi.txt"); 
 if(!m_out.is_open()) 
     cout<<"can't create 4yuanshi.txt;\n"; 
 vector tempstring; 
   for(j = 90;j != 64; --j) 
   {   
	   ch[0]=char(j); 
      tempstring.push_back(ch); 
   } 
 list >::iterator listiter; 
 for(listiter=listsource.begin();listiter!=listsource.end();++listiter) 
 { 
	 cout<<"\t"<first< >::iterator listiter1; 
     cout< > listsource1; 
	 copy(listiter,listsource.end(),back_insert_iterator > >(listsource1)); 
     for(listiter1=listsource1.begin();listiter1!=listsource1.end();++listiter1) 
		cout<first; 
	 cout<first); 
	 if(j==-1) 
		 return false; 
	 if(actionAndgoto[i][j]) 
	 {   
		 t=100*i+j; 
         pair 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< > 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<(wordyun[(int)strtofloat1(m_str.substr(local+1,m_str.size()-local-1))].suan,strstr)); 
			break; 
		case 3: 
			listsource.push_back(pair(wordjie[(int)strtofloat1(m_str.substr(local+1,m_str.size()-local-1))].jie,strstr)); 
			break; 
		case 4: 
		case 5: 
            listsource.push_back(pair('i',strstr)); 
			break; 
	} 
} 
cout<