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(); }