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
为什么 不能够 连续 在一起 判断
只显示 第一个的 格式 第二个 却不识别
还要哪些改进 才能 让它们 全部显示出来




