TP de compilation : une solution de l'exercice 6 du TP 1

Cet exercice montre les limites de Lex qui peut reconnaître et changer des motifs (par exemple de 'A' vers 'T') dans l'ordre de leur arrivée dans le flux d'entrée. On a vu aussi que des actions simples permettent de mémoriser certains paramètres (par exemple le nombre de parenthèses) au cours de l'analyse du flot d'entrée. Mais je ne connais pas de mécanisme permettant à Lex d'inverser le flot d'entrée!! Voici donc un problème où l'utilisation de Lex est d'un intérêt limité...

La solution proposée lit tout le flot d'entrée et le conserve en mémoire jusqu'à la fin de la lecture, puis le retourne en sens inverse ; la structure de données utilisée est donc une pile.
On suppose qu'est défini dans un fichier pile.c une pile P avec les primitives indispensables : P.initialiser(), P.estvide(), P.empiler(char c), P.depiler().
%{
#include pile.c
char c;
%}
%%
^\n     {return 0 ;}
[Aa]    {P.empiler('T');}
[Tt]    {P.empiler('A');}
[Gg]    {P.empiler('C');}
[Cc]    {P.empiler('G');}
.       {P.initialiser(); return -1;}
\n      { while (!P.estvide())
            {c=P.depiler(); printf("%c",c); print("\n");}
          P.initialiser();
          return 1; }
%%
main() {
  P.initialiser;
  while (yylex()!=0);
}

© 2000, 2017 – A. Sigayret