/* reconnaissance de declaration de variable Avant d'appeler ce module on a deja identifie que c'est une declaration de variable en lisant le premier token Il faudra obtenir une liste qui separe le type general des variables et de leur modificateurs. De plus il faut tenir comptes des listes de variables de meme type separe par des tokens Le module ne peut pas faire la difference entre un nom de variable et un type; elle fonctionne uniquement par position. */ #include "proto.h" /* Lit une sequence jusqu'au point virgule en separant en sous-sequence a chaque virgule Chaque sous-sequence est enregistre dans une var[] sans son terminateur. Retourne le nombre de sous-sequence */ int cproto_enddecl ( TOKEN_LIST var[], TOKEN *tok) { int novar = 0; TOKEN_LIST *ptvar = &var[0]; int ok = 0; do { tokrec_init (ptvar); do { tokrec_add (ptvar,tok); if (tok->type == TOK_OPNPAR){ static TOK_TYPE tb[][2]={ {TOK_OPNPAR,TOK_CLSPAR}, {TOK_OPNBRACE,TOK_CLSBRACE} }; tokrec_newsub (ptvar); tokrec_recskip (ptvar,tb,2); tokrec_endsub (ptvar); } ok = token_get(tok); } while (ok != -1 && tok->type != TOK_PTV && tok->type != TOK_VIRGULE); novar++; ptvar++; }while (ok != -1 && tok->type != TOK_PTV && token_get(tok)!=-1); return (novar); } /* Lit une ligne de declaration de parametre Retourne le nombre de variable declare dans cette ligne */ int cproto_recdecl ( TOKEN_LIST typel[], TOKEN_LIST varl[], TOKEN *tok) { TOKEN_LIST *gen = &typel[0]; int novar=0; tokrec_init (gen); tokrec_add (gen,tok); while (token_get(tok)!=-1){ TOK_TYPE type = tok->type; if ( type == TOK_STAR || type == TOK_OPNPAR || (type == TOK_KEYWORD && tok->type2.keyword == KEY_CONST)){ novar += cproto_enddecl (&varl[novar],tok); break; }else if (type == TOK_ID){ /* lit le suivant */ TOKEN next; int ok = token_get (&next); if (ok != -1){ token_unget (&next); if (next.type == TOK_VIRGULE || next.type == TOK_OPNBRAK || next.type == TOK_OPNPAR || next.type == TOK_PTV){ novar += cproto_enddecl (&varl[novar],tok); break; }else{ tokrec_add (gen,tok); } } }else{ tokrec_add (gen,tok); } } { int i; for (i=1; i