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;j name[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) { stack status_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<