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