TP de Compilation : une solution de l'exercice 2 du TP 1
2.1.
Cet analyseur affiche, après chaque ligne, le nombre cumulé de caractères
saisis (hors retours à la ligne).
L'analyseur s'arrête à la première ligne vide qu'il
rencontre (motif ^\n
).
Il affiche alors le nombre de total de caractères saisis
(hors retours à la ligne).
Pour avoir le nombre de caractères de chaque ligne, il faut que la
réinitialisation de la variable se fasse entre chaque ligne.
L'instruction c=0
doit donc être déplacée vers la ligne :
\n
{printf("total ligne %d\n",c);}
qui devient :
\n
{ printf("total ligne %d\n",c); c=0; }
Il est alors inutile d'écrire la fonction main() qui sera
engendrée automatiquement (argument -ll
de gcc).
2.2. et 2.3.
Le programme suivant compte les chiffres, points et opérateurs
par ligne et donne les totaux finaux.
%{
int ch,po,op; // chiffres, points et operateurs par ligne
int tc, tp, to; // totaux
%}
%%
^\n {return 0;}
[0-9] {ch++;tc++;}
"." {po++;tp++;}
[-+*/] {op++;to++;}
. ;
\n
{ printf("%d ch, %d po, %d op\n",ch,po,op); ch=0; po=0; op=0; }
%%
main() {
ch=0; po=0; op=0; tc=0; tp=0; to=0;
yylex();
printf("total final :\n");
printf("%d chiffres, %d points, %d opérateurs.\n",tc,tp,to);
}
Observations :
• Le tiret est un méta-caractère qui, entre crochets,
indique un intervalle, SAUF s'il est juste après le crochet ouvrant.
• Le point est un méta-caractère, pour reconnaître
le CARACTERE point on écrit donc "." (caractère ou chaîne explicite).
• Le plus et l'astérisque ne sont plus des méta-caractères
quand ils sont entre crochets.
• Flex accepte identiquement les deux lignes
.
;
et
.
car dans ces deux cas, aucun affichage n'est associé au motif reconnu.
© 2000, 2017 – A. Sigayret