消除由GCC生成的抽象语法树的冗余信息

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<queue>

#define MAX 100
#define SIZE 20000
#define size 300
#define SUB 10

char 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;
}



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值