复杂声明

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXTOKEN 100
enum{NAME,PARENS,BRACKETS};
void dcl(void);
void dirdcl(void);
int gettoken(void);
int tokentype;
char token[MAXTOKEN];
char name[MAXTOKEN];
char datatype[MAXTOKEN];
char out[100];
int main()
{
	while(gettoken()!='%')
	{
		strcpy(datatype,token);
		out[0]='\0';
		dcl();
		if(tokentype!='\n')
			printf("syntax error\n");
		printf("%s %s %s\n",name,out,datatype);
	}
	return 0;
}
void dcl(void)
{
	int ns;
	for(ns=0;gettoken()=='*';)//
		ns++;
	dirdcl();
	while(ns-->0)
	//	printf("1");
		strcat(out,"pointer to");
}
void dirdcl(void)
{
	int type;
	if(tokentype=='('){
		dcl();
		if(tokentype!=')')
			printf("error:missing)\n");
	}else if(tokentype==NAME)
	{
		strcpy(name,token);
	}else{
		printf("error:expected name or(dcl)\n");
	}
	while((type=gettoken())==PARENS||type==BRACKETS)
		if(type==PARENS)
		{
			strcat(out,"function returning");
		}else
		{
			strcat(out,"array");
			strcat(out,token);
			strcat(out,"of");
		}
}
int gettoken(void)
{
	int c,getch(void);
	void ungetch(int);
	char *p=token;
	while((c=getch())==' '||c=='\t');
	if(c=='(')
	{
		if((c=getch())==')')
		{
			strcpy(token,"()");
			return tokentype=PARENS;
		}else{
			ungetch(c);
			return tokentype='(';
		}
	}else if(c=='[')
	{
		for(*p++=c;(*p++=getch())!='[';);
		*p='\0';
		return tokentype=BRACKETS;
	}else if(isalpha(c))
	{
		for(*p++=c;isalnum(c=getch());)
		{
			*p++=c;
		}
		*p='\0';
		ungetch(c);
		return tokentype=NAME;
	}else{
		return tokentype=c;
	}
}
#define BUFSIZE 100
char buf[BUFSIZE];
int bufp=0;
int getch(void)
{
	return (bufp>0)?buf[--bufp]:getchar();
}
void ungetch(int c)
{
	if(bufp>=BUFSIZE)
	{
		printf("ungetch:too many characters\n");
	}else{
		buf[bufp++]=c;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值