Ainsi, pour compiler l'analyseur syntaxique lysa decrit par miny. y utilisant la definition d'un analyseur lexical on procede: lysa: mini. y bison -d -omini. c mini. y flex gcc -Wall -c gcc -Wall -c mini. c gcc -Wall -o lysa mini. o -ll [ 1] Compilez votre analyseur mini. y avec l'option -d de bison. Jetez un coup d'oeil au fichier entete qui a été créé. [ 2] Ecrire l'analyseur lexical de votre calculette à mémoires avec flex. [ 3] Compilez. Verifiez le bon fonctionnement de votre calculette à mémoires. Gestion des symboles A ce stade, votre calculette gère essentiellement deux terminaux: MEM et NB, tous deux de type entier ( int). Pour inclure des symboles plus complexes, on introduit un terminal nouveau symbole terminal ID. [ 4] Modifiez votre langage pour éviter la confusion entre la case mémoire "a" et l'identificateur "a". On pourra par exemple utiliser la chaine "$A" pour désigner la case mémoire "A", dans ce cas, la ligne du genre: {MEM} yylval = 'A' - yytext[0]; return MEM; devient {MEM} yylval = 'A' - yytext[1]; return MEM; [ 5] Modifiez votre analyseur lexical, pour insérer les identificateurs rencontrés dans une table de symboles, au moyen de la règle: {ID} if (!
Analyse lexicale avec LEX - TP COMPILATION 1 - YouTube
inserer( yytext)) printf("\ninsertion... "); else printf("\ndeja vu... "); On suppose que inserer(char * k) recherche et renvoie/crée un pointeur une entrée dans la table des symboles. Pour une gestion rudimentaire, on peut utiliser: typedef struct liste{ char * cle; int data; struct liste * svt;} noeud, *liste; liste ts = NULL; liste inserer( char * k) { liste aux; aux = ts; while ( aux) { if ( strcmp( aux->cle, k) == 0) return aux; aux = aux -> svt;} printf("\nInsertion... "); aux = ( liste) malloc( sizeof(noeud)); aux->cle = (char *) malloc( strlen(k) + 1); strcpy( aux->cle, k); a ux->data = 0; aux->svt = ts; ts = aux; return ts;} [ 6] Pour gérer les valeurs des symboles, il faut manipuler plusieurs types au niveau du port yylval. Les attributs de MEM et NB sont entiers et l'attribut de ID est de type liste. La déclaration d'union bison%union { int val; liste ptr;} definit le type adéquate dans YYSTYPE. {MEM} = 'A' - yytext[1]; return MEM; {NB} = atoi( yytext); return NB; {ID} = inserer( yytext); return ID; Compilez votre analyseur mini.