这是源程序代码,有兴趣的童鞋可以看看~有关于栈的使用的。
函数的功能是,对一个变量和函数的声明的解读:如判断 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 编辑 ]