Newsgroup: it.comp.lang.c
Titolo: K&RII Es. 5-18 Fate in modo che dcl gestisca gli errori sull'input.

Scusate la prolissità ma
voi come avete risolto l'esercizio?
Qualche suggerimento?
Grazie
________
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXTOKEN 100
enum {NAME, PARENS, BRACKETS};
int tokentype;            /* tipo dell'ultimo token */
char token[MAXTOKEN];     /* ultimo token */
char name[MAXTOKEN];      /* nome identificatore */
char datatype[MAXTOKEN];  /* tipo dei dati=char, int ... */
char out[10 * MAXTOKEN];  /* stringa di output */
int error;
int last_tok_typ;
#define  BUFSIZE  100
int buf[BUFSIZE];
int bufp=0;
int getch(void)
{return (bufp>0) ? buf[--bufp] : getchar();}
void ungetch(int c)
{if(bufp>=BUFSIZE)
   printf("ungetch: troppi caratteri\n");
 else buf[bufp++]=c;
}
/* gettoken: ritorna il token successivo*/
int gettoken(void) 
{int c, getch(void);
 void ungetch(int);
 char *p=token;
 last_tok_typ=tokentype;
 while((c=getch())==' ' || c=='\t');
 if(c=='(')
    {
     if( (c=getch())==')' )
               {strcpy(token, "()");
                return tokentype=PARENS;
               }
     else {if(c!=EOF) ungetch(c);
           return tokentype='(';
          }
    }
 else if(c=='[')
     {
      while((*p++=getch())!=']' && *(p-1)!='\n' && 
                *(p-1)!=EOF );
      if(*--p==']')
                  {*p='\0';
                   return tokentype=BRACKETS;
                  }
      if(*p!=EOF) ungetch(*p);
      *p='\0';
      return tokentype='[';
     }
 else if(isalpha(c))
     {for(*p++=c; isalnum(c=getch()); )
                 *p++=c;
      *p='\0';
      if(c!=EOF) ungetch(c);
      return tokentype=NAME;
     }
 else
     {
      return tokentype=c;
     }
}
void errore(void)
{printf("Trovo errore in \"%s\" \n", 
    tokentype==BRACKETS ? "[]" : (tokentype==PARENS ? "()" : token) );
 token[0]='\0';
 datatype[0]='\0';
 error=1;
}
/* dcl: analizza un dichiaratore */
void dcl(void)
{void dirdcl(void);
 int ns;
 for(ns=0;gettoken()=='*'; ns++);
 dirdcl();
 while(ns-- > 0)
   strcat(out, " puntatore a");
}
/* dirdcl: analizza un dichiaratore diretto */
void dirdcl(void)
{int type;
 if(tokentype=='(')
    {dcl();
     if(tokentype!=')') 
       {printf("Errore: manca una parentesi )\n");
        errore();
        return;
       }
    }
 else if(tokentype==NAME) strcpy(name, token);
 else if(last_tok_typ=='[') 
          {printf("Errore mancano una o più parentesi ] \n");
           errore();
           return ;
          }
 else 
  {printf("Errore: atteso un nome o un (dcl) e non il tipo \"%d\" \n",
tokentype);
    if(last_tok_typ=='(') printf("Manca una o più parentesi ) \n"); 
    errore();
    return;
  }
 while((type=gettoken())==PARENS || type==BRACKETS )
   if(type==PARENS)
         strcat(out, " funzione che ritorna");
   else 
        {strcat(out, " vettore");
         strcat(out, " di ");
         strcat(out, token);
        }
}
/* main() : converte le dichiarazioni in descrizioni verbali */
int main(void)
{while(gettoken()!=EOF)
       {strcpy(datatype, token);
        /* il primo token della linea è il tipo dei dati */
        out[0]='\0';
        while(tokentype!='\n' && tokentype!=EOF) dcl();
        if(error==0)
                 printf("  %s: %s %s\n", name, out, datatype);
        else printf("Si sono verificati errori \n");
        error=0;
       }
 return 0;
}

Grazie
Scusate la curiosità ma *qui* sono solo io che lo ho fatto cotale
esercizio?

 Qualche suggerimento?
ci sono delle pagine in cui trovi tutti gli esercizi del libro risolti
prova a fare una ricerca con google