#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;
}
消除由GCC生成的抽象语法树的冗余信息
最新推荐文章于 2023-05-13 14:29:05 发布