TP de Compilation : une solution de l'exercice 1 du TP 4

1.1.
Cette grammaire reconnait le langage anbn, avec n entier naturel.
Si le mot est reconnu, l'analyseur affiche : j'accepte le mot sinon il affiche : syntax error
Dans les deux cas, le programme se termine après la première ligne saisie.
Les affichages associés aux règles de la grammaire permettent de savoir quelles règles ont été utilisées pour le mot saisi.

1.2.
La redéfinition de la fonction yyerror() empêche l'affichage par défaut du message "syntax error" quand l'analyseur ne trouve pas de règle à appliquer.

1.3.
Si le mot est reconnu, l'analyseur affiche maintenant : mot accepté sinon il affiche :  erreur!   mot refusé
Le message d'acceptation ou de refus d'un mot a été placé dans le main().
Le pseudo-terminal error permet, en cas d'erreur, de "consommer" tous les terminaux du flux d'entrée jusqu'à un retour à la ligne.

1.4.
 
%{
int t;
%}
%%
S : M '\n'     {return 0;}
  | error '\n' {return 1;}
  ;
M : 'a' M 'b'
  |
  ;
%%
int yylex() {
  char c=getchar();
  if ((c=='a')||(c=='b')||(c=='\n')) return(c) ;
  else {printf("%c: caractère inconnu\n",c); exit(-1);}
}
yyerror(){;}
main() {
  do {
     t=yyparse();
     if (t==0) printf("mot accepté\n");
     if (t==1) printf("mot refusé\n");
  } while (t>=0);
}

La règle (S → error '\n') détecte les erreurs. Elle permet à l'analyseur de revenir en situation normale d'analyse dès qu'il rencontre '\n', c'est-à-dire en fin de ligne. Ainsi chaque ligne correspondra à un mot refusé ou accepté. Le programme continuera à attendre de nouveaux mots, jusqu'à ce que la présence d'un caractère inconnu mette fin brutalement au programme par la commande exit(-1).
N.B. il existe bien sûr d'autres solutions...

© 2000, 2017 – A. Sigayret