TP de Compilation : une solution de l'exercice 3 du TP 4
3.1.
Pour éviter un conflit shift/reduce
dans la grammaire suivante, on a donné une associativité
gauche aux parenthèses. D'autres choix étaient possibles.
%left '(' ')'
%%
MOT : S '\n' {printf("mot accepté\n");
return 0;}
| error '\n' {printf("mot refusé\n");
return 1;}
;
S : S '(' S ')' S
| AB
|
;
AB : 'a' AB
| 'b' AB
| 'a'
| 'b'
;
%%
int yylex()
{
char c=getchar() ;
if ((c=='(')||(c==')')||(c=='a')||(c=='b')||(c=='\n'))
return(c) ;
else
{ printf("%c: je ne connais pas ce caractere!\n",c);
exit(-1); }
}
int yyerror() {;}
main()
{while (yyparse()<=1);}
3.2.
Même remarque ici.
%left 'a' 'b'
%%
MOT : S '\n' {printf("mot accepté\n");
return 0;}
| error '\n' {printf("mot refusé\n");
return 1;}
;
S : A B
;
A : 'a'
| 'a' T 'a'
;
B : 'b'
| 'b' T 'b'
;
T : 'c'
| 'd'
| A B
;
%%
int yylex()
{
char c=getchar() ;
if ((c=='a')||(c=='b')||(c=='c')||(c=='d')||(c=='\n'))
return(c) ;
else
{printf("%c: je ne connais pas ce caractere!\n",c);
exit(-1);}
}
int yyerror() {;}
main()
{while (yyparse()<=1);}
N.B. : pour les deux grammaires ci-dessus, il reste à prouver formellement
que le langage reconnu est le même que celui de l'énoncé!...
© 2000, 2017 – A. Sigayret