消除由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;}

原创粉丝点击