/* Enregistrement de suite de token */ #include #include #include #include "assert.h" #include #include #include "proto.h" void tokrec_init (TOKEN_LIST *toklist) { toklist->first = NULL; toklist->current[0] = NULL; toklist->curlevel = 0; } /* Ellimine tous les tokens de la structure TOKEN_LIST */ static void tokfree (TOKEN_ITEM *item) { while (item != NULL){ TOKEN_ITEM *next = item->next; tokfree (item->sous); free (item); item = next; } } /* Libere la liste silencieusement */ void tokrec_free (TOKEN_LIST *toklist) { tokfree (toklist->first); tokrec_init(toklist); } static void tokprtout (TOKEN_ITEM *item) { while (item != NULL){ TOKEN_ITEM *next = item->next; outsrc_prttoken (&item->tok); tokprtout (item->sous); item = next; } } /* Affiche la liste des tokens. */ void tokrec_prt (TOKEN_LIST *toklist) { tokprtout (toklist->first); } /* Ajoute un token a la suite courante */ void tokrec_add ( TOKEN_LIST *toklist, TOKEN *tok) { int curlevel = toklist->curlevel; TOKEN_ITEM **current = toklist->current; TOKEN_ITEM *item = (TOKEN_ITEM*)malloc_err(sizeof(TOKEN_ITEM),1); if (current[curlevel] != NULL){ current[curlevel]->next = item; }else if (curlevel > 0){ current[curlevel-1]->sous = item; }else{ toklist->first = item; } item->tok = *tok; item->next = NULL; item->sous = NULL; current[curlevel] = item; } /* Demarre une liste subalterne au dernier token entre */ void tokrec_newsub (TOKEN_LIST *toklist) { assert (toklist->current[toklist->curlevel]!=NULL); toklist->curlevel++; toklist->current[toklist->curlevel] = NULL; assert (toklist->curlevelcurlevel>0); toklist->curlevel--; } /* imprime le contenu d'une liste de token */ void tokrec_printcur (TOKEN_ITEM *item) { while (item!=NULL){ token_print (&item->tok); tokrec_printcur (item->sous); item = item->next; } } void tokrec_print (TOKEN_LIST *toklist) { tokrec_printcur(toklist->first); } static char *frmtxt ( TOKEN_ITEM *item, char *txt) { while (item != NULL){ TOKEN *tok = &item->tok; char *toktxt = token_txt(tok); strcpy (txt,toktxt); txt += strlen(toktxt); if (tok->type == TOK_ID || tok->type == TOK_KEYWORD){ *txt++ = ' '; *txt = '\0'; } if (item->sous!=NULL) txt = frmtxt(item->sous,txt); item = item->next; } return (txt); } void tokrec_frmtxt ( TOKEN_LIST *toklist, char *txt) { frmtxt (toklist->first,txt); } #ifdef TEST main() { TOKEN_LIST tokl; TOKEN t1,t2; strcpy (t1.text,"1"); strcpy (t2.text,"2"); t1.longtxt = t2.longtxt = NULL; tokrec_init (&tokl); tokrec_add (&tokl,&t1); tokrec_add (&tokl,&t1); tokrec_newsub (&tokl); tokrec_add (&tokl,&t2); tokrec_add (&tokl,&t2); tokrec_endsub (&tokl); tokrec_add (&tokl,&t1); tokrec_print (&tokl); printf ("\n"); tokrec_inilec (&tokl); inter (&tokl,0); printf ("\n"); tokrec_print (&tokl); } inter (tokl,level) TOKEN_LIST *tokl; int level; { TOKEN new; TOKEN *token; new.text[0] = level+'a'; new.text[1] = '\0'; new.longtxt = NULL; while ((token = tokrec_get(tokl))!=NULL){ token_print (token); if (tokrec_descend (tokl)!=-1){ inter (tokl,level+1); tokrec_monte (tokl); } tokrec_insert (tokl,&new); tokrec_next (tokl); tokrec_next (tokl); } } #endif