这是源程序代码,有兴趣的童鞋可以看看~有关于栈的使用的。
函数的功能是,对一个变量和函数的声明的解读:如判断 char * const *(* next)();
这个是在讲什么?
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAXTOKENS 100
#define MAXTOKENLEN 64
enum type_tag
{
IDENTIFIER,QUALIFIER,TYPE
};
struct token
{
char type;
char string[MAXTOKENLEN];
};
int top = -1;
struct token stack[MAXTOKENS];
struct token the;
#define pop stack[top--]
#define push(s) stack[++top] = s
enum type_tag classify_string(void)
{
char * s = the.string;
if(!strcmp(s,"const"))
{
strcpy(s,"read-only");
return QUALIFIER;
}
if(!strcmp(s,"volatile")) return QUALIFIER;
if(!strcmp(s,"void")) return TYPE;
if(!strcmp(s,"char")) return TYPE;
if(!strcmp(s,"singed")) 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,"union")) return TYPE;
if(!strcmp(s,"enum")) return TYPE;
return IDENTIFIER;
}
void gettoken(void)
{
char *p = the.string;
while((*p = getchar()) == ' ');
//如果是字母+数字,那么就把它的类型存入the.type,内同存入the.string
if(isalnum(*p))
{
while(isalnum(*++p = getchar()));
ungetc(*p,stdin);
*p = '\0';
the.type = classify_string();
return ;
}
//如果是*,那么就把它的类型存入the.type,内同存入the.string
if(*p == '*')
{
strcpy(the.string,"pointer to");
the.type = '*';
return ;
}
the.string[1] = '\0'; //字符串后面手动加上‘\0’
the.type = *p; //如果不是前面两者,那么可能是(或[,先将它存入the.type中
return ;
}
void read_to_first_identifier()
{
gettoken();
while(the.type != IDENTIFIER) //如果没得到标识符,就将内容压入栈中,继续读下一个内容
{
push(the);
gettoken();
}
printf("%s is ",the.string); //跑出循环,说明得到标识符,输出标识符。
gettoken(); //再读下一个内容。
}
void deal_with_arrays()
{
while(the.type == '[')
{
printf("array ");
gettoken();
if(isdigit(the.string[0]))
{
printf("0..%d ",atoi(the.string)-1);
gettoken();
}
gettoken();
printf("of");
}
}
void deal_with_function_args()
{
while(the.type != ')')
{
gettoken();
}
gettoken();
printf("function returning ");
}
void deal_with_pointers()
{
while(stack[top].type == '*')
{
printf("%s ",pop.string);
}
}
void deal_with_declarator()
{
switch(the.type)
{
case '[':deal_with_arrays();break;
case '(':deal_with_function_args();
}
deal_with_pointers();
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;
}
[
本帖最后由 ysa555 于 2013-4-27 00:47 编辑 ]