www.pudn.com > expression1124.rar > expression.cpp


 
#include  
#include  
#include  
#define N 20 
 
char filename[20];   //文件名 
char ch[20]; 
 
struct expression   //表达式结构 
{ 
	char c; 
    struct expression *next; 
}; 
 
struct keyword   //保留字表结构 
{ 
	char key[10];   //保留字 
	int num;        //类别编码 
}stu[13]={{"program",3},{"var",4},{"procedure",5},{"begin",6},{"end",7},{"if",8}, 
{"then",9},{"else",10},{"while",11},{"do",12},{"call",13},{"integer",14},{"real",15}},st; 
 
struct symbol    //运算符表结构 
{ 
	char s;      //运算符 
	int num;     //类别编码 
}ope[5]={{'+',16},{'-',17},{'*',18},{'/',19},{'|',20}},op; 
 
struct Id      //标识符表结构 
{ 
	char str[20]; //标志符 
}iden[N],ide; 
 
struct number   //常数表结构 
{ 
	int n;      //常数 
}num[N],nu; 
 
struct word    //单词结构 
{ 
	int type;   //类别编码 
	char fword[20];  //单词 
}dword[N],dword1; 
 
struct expression *h1; 
int a=0,b=0,c=0; 
 
void creat1();    //存储保留字文件 
void creat2();    //存储运算符文件 
void creat3();    //存储标识符文件 
void creat4();    //存储常数文件 
void creat5();    //存储单词文件,即输出结果文件 
void output1();   //显示保留字文件 
void output2();   //显示运算符文件 
void output3();   //显示标识符文件 
void output4();   //显示常数文件 
void output5();   //显示单词文件 
 
//读取表达式文件显示并建立该结构链表 
void init(struct expression *head) 
{ 
	FILE *fp; 
	char c; 
	struct expression *p1,*p2=head; 
	printf("请输入表达式的文件名:"); 
    scanf("%s",filename); 
    if((fp=fopen(filename,"r"))==NULL) 
	{ 
		printf("\nopen file error"); 
		exit(1); 
	} 
	printf("表达式如下:\n"); 
    c=getc(fp); 
	while(c!='#') 
	{ 
        p1=(struct expression *)malloc(sizeof(struct expression));  //尾插法建链表 
	    p1->c=c; 
        putchar(p1->c); 
		p2->next=p1; 
	    p1->next=NULL; 
        p2=p1; 
		c=getc(fp); 
	} 
	p1=(struct expression *)malloc(sizeof(struct expression));  //链表尾添加'#'节点 
	p1->c='#'; 
	p1->next=NULL; 
	p2->next=p1; 
	p2=p1; 
	fclose(fp); 
} 
 
//词法分析主过程 
void chang() 
{ 
	struct expression *p=h1->next; 
	int i,j,m,n; 
	char data,sum,sh[10]; 
  
    while(p->c!='#') 
	{ 
		m=0; 
 
		if(p->c==' ') p=p->next; 
 
        if(p->c=='\n') p=p->next; 
 
		if((p->c>='a'&&p->c<='z')||(p->c>='A'&&p->c<='Z'))   //处理标识符 
		{ 
			ch[0]=p->c; 
			p=p->next; 
			i=1; 
 
			while((p->c>='a'&&p->c<='z')||(p->c>='A'&&p->c<='Z')||(p->c>='0'&&p->c<='9')) 
            { 
                 ch[i]=p->c; 
				 i++; 
                 p=p->next; 
            } 
            ch[i]='\0';    //标识符存入ch 
 
		 while(m<13) 
			{ 
		         if(strcmp(stu[m].key,ch)==0)    //标识符与某保留字相同 
				 { 
				     strcpy(dword[a].fword,stu[m].key);  //添加到单词表 
					 dword[a].type=stu[m].num; 
					 a++; 
				     break; 
				 } 
				 else m++; 
			} 
 
			if(m>=13)    //标识符与保留字不同 
			{ 
                 strcpy(iden[b].str,ch);   //添加到标识符表 
				 b++; 
 
                 strcpy(dword[a].fword,ch);  //添加到单词表 
				 dword[a].type=1; 
				 a++; 
            } 
		} 
 
		if(p->c>='0'&&p->c<='9')   //处理常量 
		{ 
            sh[0]=p->c; 
			j=1; 
			sum=data=p->c-48; 
			p=p->next; 
             
            while(p->c>='0'&&p->c<='9') 
			{ 
                 sh[j]=p->c; 
				 j++; 
				 data=p->c-48; 
				 sum=sum*10+data;   //数值转换 
                 p=p->next; 
			} 
            sh[j]='\0'; 
 
            strcpy(dword[a].fword,sh);   //添加到单词表 
			dword[a].type=2; 
			a++; 
 
			num[c].n=sum;    //添加到常量表 
			c++; 
		} 
 
		else 
		{ 
			switch(p->c) 
			{ 
			case '+':dword[a].fword[0]=ope[0].s;  //添加到单词表 
				     dword[a].type=ope[0].num; 
					 a++; 
					 p=p->next; 
					 break; 
 
			case '-':dword[a].fword[0]=ope[1].s;   //添加到单词表 
				     dword[a].type=ope[1].num; 
					 a++; 
					 p=p->next; 
					 break; 
 
			case '*':dword[a].fword[0]=ope[2].s;    //添加到单词表 
				     dword[a].type=ope[2].num; 
					 a++; 
					 p=p->next; 
					 break; 
 
			case '/':dword[a].fword[0]=ope[3].s;    //添加到单词表 
				     dword[a].type=ope[3].num; 
					 a++; 
					 p=p->next; 
					 break; 
 
			case '|':dword[a].fword[0]=ope[4].s;    //添加到单词表 
				     dword[a].type=ope[4].num; 
					 a++; 
					 p=p->next; 
					 break; 
 
			default: if(p->c!='#')   //出错处理 
					 { 
				          printf("\nError:%c",p->c); 
				          p=p->next; 
				          break; 
					 } 
				     else   //表达式无误 
					 { 
				          creat1(); 
					      creat2(); 
					      creat3(); 
					      creat4(); 
					      creat5(); 
                          printf("\n1:显示各文件内容"); 
	                      printf("\n2:退出"); 
	                      scanf("%d",&n); 
	                      if(n==1) 
						  { 
						      output1(); 
					          output2(); 
						      output3(); 
						      output4(); 
	                          output5(); 
						  }  
					 } 
			} 
		} 
	} 
} 
 
//建立保留字文件 
void creat1() 
{ 
    FILE *fp1; 
	printf("\n请输入存储保留字表的文件名:"); 
	scanf("%s",filename); 
    fp1=fopen(filename,"w"); 
	fwrite(stu,sizeof(struct keyword),13,fp1); 
	fclose(fp1); 
} 
 
//建立运算符文件 
void creat2() 
{ 
    FILE *fp2; 
	printf("请输入存储运算符表的文件名:"); 
	scanf("%s",filename); 
    fp2=fopen(filename,"w"); 
	fwrite(ope,sizeof(struct symbol),5,fp2); 
	fclose(fp2); 
} 
 
//建立标识符文件 
void creat3() 
{ 
	FILE *fp3; 
	printf("请输入存储标识符表的文件名:"); 
	scanf("%s",filename); 
	fp3=fopen(filename,"w"); 
	fwrite(iden,sizeof(struct Id),b,fp3); 
	fclose(fp3); 
} 
 
//建立常量文件 
void creat4() 
{ 
	FILE *fp4; 
	printf("请输入存储常量表的文件名:"); 
	scanf("%s",filename); 
	fp4=fopen(filename,"w"); 
    fwrite(num,sizeof(struct number),c,fp4); 
    fclose(fp4); 
} 
 
//建立单词文件 
void creat5() 
{ 
	FILE *fp5; 
	printf("请输入存储单词的文件名:"); 
	scanf("%s",filename); 
	fp5=fopen(filename,"w"); 
	fwrite(dword,sizeof(struct word),a,fp5); 
	fclose(fp5); 
} 
 
//读取保留字文件并显示 
void output1() 
{ 
	FILE *fp1; 
	int i=0; 
	printf("\n请输入保留字表的文件名:"); 
	scanf("%s",filename); 
	fp1=fopen(filename,"r"); 
	while(i<13) 
	{ 
		fread(&st,sizeof(struct keyword),1,fp1); 
		printf("<%s  %d>\t",st.key,st.num); 
		i++; 
	} 
    fclose(fp1); 
} 
 
//读取运算符文件并显示 
void output2() 
{ 
	FILE *fp2; 
	int i=0; 
	printf("\n请输入运算符表的文件名:"); 
	scanf("%s",filename); 
	fp2=fopen(filename,"r"); 
	while(i<5) 
	{ 
		fread(&op,sizeof(struct symbol),1,fp2); 
		printf("<%c  %d>\t",op.s,op.num); 
		i++; 
	} 
	fclose(fp2); 
} 
 
//读取标识符文件并显示 
void output3() 
{ 
	FILE *fp3; 
	int i=0; 
	printf("\n请输入标识符表的文件名:"); 
	scanf("%s",filename); 
	fp3=fopen(filename,"r"); 
	while(i\t",dword1.fword,dword1.type); 
		i++; 
	} 
	fclose(fp5); 
} 
 
void main() 
{ 
	h1=(struct expression *)malloc(sizeof(struct expression)); 
	h1->next=NULL; 
     
	init(h1); 
    chang(); 
}