麻烦大家帮忙看看!一直找不到错误
#include <stdio.h>#include <string.h>
#include <ctype.h>
#define MAXTOKEN 100
#define BUFSIZE 100
void dcl(void);
void dirdcl(void);
int gettoken(void);
int getch(void);
void ungetch(int);
enum{NAME,PARENS,BRACKETS};
int tokentype; /*最后一个记号的类型*/
char token[MAXTOKEN]; /*最后一个记号字符串*/
char name[MAXTOKEN]; /*标识符名*/
char datatype[MAXTOKEN]; /*数据类型为char、int等*/
char out[1000]; /*输出串*/
char buf[BUFSIZE]; /*用于ungetch函数的缓冲区*/
int bufp=0;/*buf中下一个空闲位置*/
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;
}
/*dcl函数:对一个声明符进行语法分析*/
void dcl(void)
{
int ns;
for(ns=0;gettoken()=='*';) /*统计字符*的个数*/
ns++;
dirdcl();
while(ns-->0)
strcat(out,"pointer to");
}
/*dirdcl函数:分析一个直接声明*/
void dirdcl(void)
{
int type;
if (tokentype=='(') /*形式为(dcl)*/
{
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;
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;
}
void main() #include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXTOKEN 100
#define BUFSIZE 100
void dcl(void);
void dirdcl(void);
int gettoken(void);
int getch(void);
void ungetch(int);
enum{NAME,PARENS,BRACKETS};
int tokentype; /*最后一个记号的类型*/
char token[MAXTOKEN]; /*最后一个记号字符串*/
char name[MAXTOKEN]; /*标识符名*/
char datatype[MAXTOKEN]; /*数据类型为char、int等*/
char out[1000]; /*输出串*/
char buf[BUFSIZE]; /*用于ungetch函数的缓冲区*/
int bufp=0;/*buf中下一个空闲位置*/
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;
}
void dcl(void)
{
int ns;
for(ns=0;gettoken()=='*';)
ns++;
dirdcl();
while(ns-->0)
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;
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;
}
void main() /*将声明转换为文字描述*/
{
while (gettoken()!=EOF)
{
strcpy(datatype,token);
out[0]='\0';
dcl();
if(tokentype!='\n')
printf("syntax error\n");
printf("%s:%s %s\n",name,out,datatype);
}
}
{
while (gettoken()!=EOF)
{
strcpy(datatype,token);
out[0]='\0';
dcl();
if(tokentype!='\n')
printf("syntax error\n");
printf("%s:%s %s\n",name,out,datatype);
}
}
error C2601: 'dirdcl' : local function definitions are illegal
error C2601: 'gettoken' : local function definitions are illegal
error C2601: 'main' : local function definitions are illegal
fatal error C1004: unexpected end of file found