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