消除由GCC生成的抽象语法树的冗余信息
来源:互联网 发布:医疗保险数据采集软件 编辑:程序博客网 时间:2024/05/17 03:36
#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#include<queue>#define MAX 100#define SIZE 20000#define size 300#define SUB 10char buf[MAX];bool temp=false;int num=0;int useful = 0;int i=0;int j = 0 ;int k=0;char str[SIZE][size];char theStr[]="srcp";char theFile[]="text.c";char node1[] = "integer_type";char node2[] = "real_type";char node3[] = "identifier_node";char word1[] = "lngt";char word2[] = "srcp";char word3[] = "algn";int* flag = NULL;int* order = NULL;int sub[SIZE][SUB];struct vnode{ char nodeName[15]; int nodeTpye; struct enode* first;};struct enode{ char domainName[8]; int num; struct enode* next ;};struct CFGNode{ char* nodeSeq; StmNode* stmPointer; CFGNode* childPointer; CFGNode* brotherPointer;}void initBuf(){ int i; for(i=0;i<MAX;i++) buf[i]='*';}void get_nextval(const char* T,int next[]){ int j=0; int k=-1; next[0]=-1; while(T[j]!='\0') { if(k==-1 || T[j]==T[k]) { ++j; ++k; if(T[j]!=T[k]) next[j]=k; else next[j]=next[k]; } else k = next[k]; }}int KMP(const char* Text,const char * Pattern){ if(!Text || !Pattern || Pattern[0]=='\0' || Text[0]== '\0') return -1; int len=0; const char * c = Pattern; while(*c++ != '\0') { ++len; } int* next; next = (int *) malloc(sizeof(int) * (len+1)); get_nextval(Pattern,next); int index = 0; int i = 0; int j = 0; while(Text[i]!='\0' && Pattern[j]!='\0') { if(Text[i]==Pattern[j]) { ++i;++j; } else { index+=j-next[j]; if(next[j]!=-1) j=next[j]; else { j=0; ++i; } } } free(next); next=NULL; if(Pattern[j]=='\0') return index; else return -1;}void subNode(const char * str, int * sub){ int i = 0; int a = 1; while(str[a]!='\0') { if(str[a]!='@') a++; else { a++; sub[i] = atoi(str+a)-1; i++; a++; } }}void judeg_unknow(){ std::queue<int> q; for(i=0;i<num;i++) { if(flag[i]==2) { q.push(i); //printf("first%d\n",i); } } while(!q.empty()) { i = q.front(); //printf("queue--%d ",i); //flag[i]++; j=0; while(sub[i][j]!=0) { if(flag[ (sub[i][j] )] == 0) { q.push(sub[i][j]); flag[ (sub[i][j]) ]=2; } j++; } q.pop(); } for(i=0;i<num;i++) { if(flag[i]==2) useful++; } printf("number of useful node = %d\n",useful);}void orderID(){//order ID order = (int *)malloc(sizeof(int) * (useful +1 )); j=0; for( i =0; i<num;i++) { if(flag[i]==2) { flag[i] =j; order[j] = i; j++; } else{flag[i]=-1;} }}void eliminateSubnode(){ for(i=0;i<useful;i++) { j =0; if( (KMP(str[ order[i] ],node1) !=-1) || (KMP(str[ order[i] ] , node2 )!=-1) ) { j=25; str[(order[i])][j] = '\n'; str[(order[i])][j+1] = '\0'; /* while(str[order[i]][j]!='\0') { str[order[i]][j] = ' '; j++; } */ //str[order[i]][j-1] = '\n'; for(k=0;k<SUB;k++) { sub[order[i] ][k]=0; } continue; } j =0; if( (j=( KMP(str[ order[i] ],word2) ) ) !=-1) { for(k=j;k<j+14;k++) str[order[i]][k] = ' '; } j =0; if( (j=( KMP(str[ order[i] ],word3) ) ) !=-1) { for(k=j;k<j+14;k++) str[order[i]][k] = ' '; } j =0; if( (KMP(str[ order[i] ],node3) !=-1) && (j=( KMP(str[ order[i] ],word1) ) ) !=-1 ) { for(k=j;k<j+14;k++) str[order[i]][k] = ' '; } j=0; while(sub[(order[i])][j]!=0) { if(flag[sub[(order[i])][j] ]==-1) sub[(order[i])][j] = -1; j++; } }/* printf("AFTER e() SUB = \n"); for( i = 0;i<useful ; i++) { j=0; while(sub[(order[i])][j]!=0) { printf("%d ",sub[(order[i])][j]); j++; } printf("\n"); } */}void build(){ vnode * Node = NULL; Node = (vnode *) malloc(sizeof(vnode) * (useful+1) ); enode* e = NULL; enode* ENode =NULL ; int m = 0 ; int a1= 0; int a2 = 0; int a3 = 0; for(i = 0; i<useful;i++) { m = order[i]; for(j=8 ; str[m][j]!=' ' ; j++) { Node[i].nodeName[j-8] = str[m][j]; } Node[i].nodeName[j-8] = '\0'; Node[i].nodeTpye = 1; Node[i].first = NULL; a1 = 25 j=0 while(sub[m][j]!=0) { if(sub[m][j]==-1) { j++; continue; } ENode = (enode *) malloc(sizeof(enode)); ENode->num = flag[sub[m][j]]; ENode->next = NULL; if(j==0) { e= ENode ; Node[i].first = ENode; } else { e->next = ENode; } while(str[m][a1]!='@') { a1++; } a2=a1-7; a1=a1-2; if(str[m][a2] == ' ' ){ a2=a2+1; } for(a3=0;a3<a1-a2;a3++) { ENode->domainName[a3] = str[m][a2+a3]; } ENode->domainName[a3] = '\0'; a1+=5; e = ENode; j++; } e = NULL; }//输出 语法树 e= NULL; for(i=0;i<useful;i++) { printf("%d ",i); e= Node[i].first; while(e!=NULL) { printf("< %d:%s > ",e->num,e->domainName); e = e->next; } printf("\n"); }}int main(int argc,char **argv){ if(argc!=4) printf("Input Error!!!\n"); else printf("Input Yes!!!\n"); //打开原文件,和归并到一行的新文件 FILE* fp_in=NULL; FILE* fp_out=NULL; if( (fp_in=fopen(argv[1],"r")) == NULL ) { printf("Open inFile Error\n"); exit(0); } if( (fp_out=fopen(argv[2],"w"))==NULL) { printf("Open outFile Error\n"); exit(0); }//相同项目合并成一行 存入2.tu while(!feof(fp_in)) { initBuf(); fgets(buf,MAX,fp_in); if(buf[0]=='@') { fprintf(fp_out,"%c",'\n'); num++; i=0; while(buf[i]!='*'&&buf[i]!='\0'&&buf[i]!='\n') { fprintf(fp_out,"%c",buf[i]); i++; } fprintf(fp_out,"%c",' '); } else{ i=0; while(buf[i]==' ') i++; while(buf[i]!='*'&&buf[i]!='\0'&&buf[i]!='\n') { fprintf(fp_out,"%c",buf[i]); i++; } } }//所有行放在同一个字符串数组中 FILE* fp = NULL; if( ( fp=fopen(argv[2],"r") )==NULL) { printf("Open 2.tu Error!!!\n"); exit(0); } printf("number of all node =%d\n",num); //取第一行的空格 fgets(str[j],size,fp); for( ; j <num; j++ ) { fgets(str[j],size,fp); } fclose(fp); //flag用来判定节点0=unknow 1=useless 2=useful flag = (int *)malloc(sizeof(int) * (num+1));//STEP 1 for(j=0;j<num;j++) { //初始为0; flag[j]=0; //只匹配到srcp 为 1 if( KMP(str[j],theStr) != -1 ) { flag[j]++; } //又匹配到文件名 为 2 if( KMP(str[j],theFile) != -1 ) flag[j]++; }//求去子节点并存储在sub二维数组中 for(i=0;i<num;i++) for(j=0;j<SUB;j++) sub[i][j]=0; for(i = 0;i < num; i++) subNode(str[i],sub[i]);// STEP 2 judeg_unknow();//映射编号 orderID();//消除冗余字段 eliminateSubnode();//输出到文件3.tu FILE * fpx; if( (fpx=fopen(argv[3],"w"))==NULL) { printf("Open outFile Error\n"); exit(0); } for(i=0;i<useful;i++) fprintf(fpx,"%s",str[order[i]]); fclose(fpx);//构造语法树 并输出到屏幕 build(); return 0;}