C语言cdelc实现

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAXTOKENLEN 64
#define MAXTOKENS 100

/*《C专家编程》:cdecl 实现 注释见P71*/

enum type_tag {IDENTIFIER,QUALIFIER,TYPE};

struct token 
{
  char type;
  char string[MAXTOKENLEN];
};

int top = -1;
struct token stack[MAXTOKENS];
struct token This;

#define pop stack[top--]
#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 QUALIFIER;
  }

  if(!strcmp(s,"void")) return TYPE;
  if(!strcmp(s,"char")) return TYPE;
  if(!strcmp(s,"void")) 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()   
{ 
  char *p = This.string;

  while((*p = getchar()) == ' ')
	  ;

  if(isalnum(*p))
  {
    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_pointers()
{ 
  while(stack[top].type == '*')
  {
    printf("%s ",pop.string);
  }
}


void deal_with_declarator()
{ 
  switch(This.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值