c专家编程中 有一段代码 不是很理解
程序代码:
#include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #define MAXTOKENS 100 #define MAXTOKENLEN 64 enum type_tag{IDENTIFIER,QUALIER,TYPE}; struct token { char type; char string[MAXTOKENLEN]; }; int top = -1; struct token stack[MAXTOKENS]; struct token this; #define pop stack[MAXTOKENS] #define push(s) stack[++top]=s enum type_tag classify_string(void) { char *s = this.string; if(!strcmp(s,"const")) { strcpy(s,"read_only"); return QUALIER; } if(!strcmp(s,"volatile")) return QUALIER; if(!strcmp(s,"void")) return TYPE; if(!strcmp(s,"char")) return TYPE; if(!strcmp(s,"signed")) return TYPE; if(!strcmp(s,"unsigned")) return TYPE; if(!strcmp(s,"short")) return TYPE; if(!strcmp(s,"int")) return TYPE; if(!strcmp(s,"long")) return TYPE; if(!strcmp(s,"float")) return TYPE; if(!strcmp(s,"double")) return TYPE; if(!strcmp(s,"struct")) return TYPE; if(!strcmp(s,"union")) return TYPE; if(!strcmp(s,"enum")) return TYPE; return IDENTIFIER; } //读取下一个标记 void gettoken(void) { char *p=this.string; while((*p=getchar())==' ') ; if(isalnum(*p))//当*p为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零 { while(isalnum(*++p=getchar())) ; ungetc(*p,stdin); *p='\0'; this.type=classify_string(); return; } if(*p=='*') { strcpy(this.string,"pointer to"); this.type='*'; return; } this.string[1]='\0'; this.type=*p; return; } void read_to_first_identifier() { gettoken(); while(this.type!=IDENTIFIER)//判断数据是否为整形 { push(this); gettoken(); } printf("%s is ",this.string); gettoken(); } void deal_with_arrays() { while(this.type=='[') { printf("array "); gettoken(); if(isdigit(this.string[0])) { printf("0..%d",atoi(this.string)-1); gettoken(); } gettoken(); printf(" of "); } } void deal_with_function_args() { while(this.type!=')') { gettoken(); } gettoken(); printf("function returning"); } void deal_with_pointer() { while(stack[top].type=='*') { printf("%s",pop.string); } } //处理在读入到标示符之前压入到cai中的符号 void deal_with_declarator() { switch(this.type) { case'[':deal_with_arrays(); break; case'(':deal_with_function_args(); break; case'*':deal_with_pointer(); break; } while(top>=0) { if(stack[top].type=='(') { pop;//这个地方老错 不知道为什么 gettoken(); deal_with_declarator(); } else { printf("%s",pop.string); } } } int main() { read_to_first_identifier(); deal_with_declarator(); printf("\n"); return 0; }
输入 char *p; 结果是 p is
输入 int a[3] 结果是 a is array [0..2]
当输入 int a(); 结果是 a is a function returning
为什么 不能够 连续 在一起 判断
只显示 第一个的 格式 第二个 却不识别
还要哪些改进 才能 让它们 全部显示出来