TP n°2 de Compilation

Dernière mise à jour 30/01/2017

Exercice 1

Contruire un analyseur lexical qui vérifie s'il n'y a pas deux fois de suite le même mot dans un texte et qui supprime, le cas échéant, la deuxième occurrence du mot.
    – Dans un premier temps, la fin du texte sera indiquée par un point ;
    – Dans un deuxième temps, l'analyse s'achèvera après la première ligne qui ne se termine pas par la chaîne "//".

Exercice 2

2.1.
Construire un analyseur qui, pour chaque lettre minuscule d'un texte, affiche après chaque ligne le nombre de fois où cette lettre est apparue en tout.

2.2. * (à ne construire réellement que si vous êtes en avance)
Comment construire un analyseur qui, pour chaque mot (en minuscules) d'un texte, affiche le nombre de fois où ce mot est apparu ? en quoi le problème est-il plus compliqué ?


Exercice 3

3.1.
Saisir le fichier exc3.lex suivant :
%s anomalie
%%
[ \t]              ;
<INITIAL>[0-9]+    {printf("    nombre %s\n",yytext);}
<INITIAL>"("|")"   {printf("parenthèse %s\n",yytext);}
<INITIAL>"+"|"-"|"div"|"mod"   {printf(" opérateur %s\n",yytext);}
<INITIAL>.      {printf("anomalie!\n"); BEGIN(anomalie);}
^FIN$           {return 0;}
<anomalie>.+    ;
\n              {BEGIN(INITIAL);}

3.2.
Tester l'analyseur avec les lignes suivantes :
( 35 + 9 / (5*2+6) )
( 35 + 9 / A * (5*2+6) )
( 3.5 + 9 / A * (5*2+6) )
6 + 7
Conclusion ?

3.3.
Modifier ce programme pour qu'il bascule aussi dans le mode "anomalie" si le parenthésage est incorrect.

Exercice 4

Modification de l'analyseur de la question 5.3.b de l'exercice 5 du TP1 : l'analyseur devra parcourir le brin d'ARN jusqu'à trouver un codon START et commencer la traduction. Il finira la traduction par un codon STOP ou indiquera une fin non conforme.

Exercice 5

Construire un analyseur qui soit capable de reconnaître à la fois un programme source en C/C++ et un programme sources en Pascal, un même source n'utilisant qu'un seul langage. On se limitera à l'exemple sans variables ci-dessous. (Bien évidemment, en Pascal, BEGIN vient avant END et, en C/C++, on doit avoir dans l'ordre main(), {, et })
 
// en C/C++

main() {
  printf("alors, ");
  printf("c'est bien ca?\n");   
  /* etc */
}
(* en Pascal *)

BEGIN
  write('alors, ');
  writeln('c''est bien ca?');   
END.