这段时间学习了一下编译技术,由于上机实验的要求,写了这么个查添符号表的小程序,有兴趣的朋友可以看看,随便取用。 #include <iostream> #define LEN 1000 //标识符串的最大长度 using namespace std; struct ID { char name[8]; //存放登记标识符名字 int addr; //记录标识符编号 }id[125]; //标识符 char A[8]; //工作数组 int K=0; //记录读入的标识符个数 int I=0; //记录每个标识符读入的字符个数 int i=0; //循环控制变量 int j=0; //循环控制变量 bool load=true; //表示某一标识符是否能被添加到标识符表中 char str[LEN]; //从键盘输入的字符串 char nul[8]=" "; //用于清空工作数组 int main() { printf("输入若干个字符串,以逗号隔开,并以分号结束/n"); scanf("%s",str); for(i=0;i<strlen(str);i++) { if(str[i]==';') { for(j=0;j<K;j++) if(strcmp(A,id[j].name)==0) load=false; if(load) { strcpy(id[K].name,A); id[K].addr=100+K; K++; } I=0; load=true; strcpy(A,nul); if(K==0) { printf("标识符表为空。/n"); return 1; } else if(K>0) { printf("标识符/t/t编号/n"); for(j=0;j<K;j++) printf("%s/t/t%d/n",id[j].name,[j].addr); return 1; } } else if(str[i]==',') { if(I==0) { printf("错误提示:第%d列的','是多余的。/n",i+1); return 1; } else if(I>0) { for(j=0;j<K;j++) if(strcmp(A,id[j].name)==0) load=false; if(load) { strcpy(id[K].name,A); id[K].addr=100+K; K++; } I=0; load=true; strcpy(A,nul); } } else if((str[i]<='z'&&str[i]>='a')||(str[i]<='Z'&&str[i]>='A')) { A[I]=str[i]; I++; } else if(str[i]<='9'&&str[i]>='0') { if(I==0) { printf("错误提示:第%d行处不能为数字。/n",i+1); return 1; } else if(I>0) { A[I]=str[i]; I++; } } else { printf("错误提示:第%d列的字符%c是非法字符。/n",i+1,str[i]); return 1; } } return 1; }