TP de compilation : une solution de l'exercice 5 du TP 2

Attention : on ne réalise ici que l'analyse syntaxique du programme (on ne vérifie notamment pas l'usage des point-virgules). Cependant, on efface déjà les commentaires du programme et on vérifie que la fin du programme est postérieure au début.
 
%s PASCAL
%s P_comment
%s P_ecrire
%s P_Lecrire
%s C
%s C_comment
%s C_ecrire
%%
<INITIAL,PASCAL>"(*"     {BEGIN(P_comment);}
<P_comment>"*)"          {BEGIN(PASCAL);}
<INITIAL,C>"/*"          {BEGIN(C_comment);}
<C_comment>"*/"          {BEGIN(C);}
<P_comment,C_comment>.   ;
<PASCAL,C>";"            (printf("fin d'instruction\n");}
<INITIAL,C>"main()"      { BEGIN(C); printf("C: principal\n"); }
<C>"{"                   {printf("C: début\n");}
<C>"}"                   {printf("C: fin\n");}
<C>"printf("["]          {BEGIN(C_ecrire);}
<C_ecrire>["]")"         {BEGIN(C);}
<C_ecrire>"\n"           {printf("\n");}
<C_ecrire>.              {ECHO;}
<INITIAL,PASCAL>"BEGIN"   { BEGIN(PASCAL); printf("Pascal: début\n"); }
<PASCAL>"END."           {printf("Pascal: fin\n");}
<PASCAL>"write('"        {BEGIN(P_ecrire);}
<PASCAL>"writeln('"      {BEGIN(P_Lecrire);}
<P_ecrire>"')"           {BEGIN(PASCAL);}
<P_Lecrire>"')"          {printf("\n"); BEGIN(PASCAL);}
<P_ecrire,P_Lecrire>.    {ECHO;}
.                        {printf("erreur\n");}
\n                       {BEGIN(INITIAL;}

© 2000, 2017 – A. Sigayret