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