复杂声明

来源:互联网 发布:写程序的软件 编辑:程序博客网 时间:2024/05/01 00:01
#include <stdio.h>#include <string.h>#include <ctype.h>#define MAXTOKEN 100enum{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 100char 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;}}

0 0