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