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