TP de compilation : une solution de l'exercice 1 du TP 5

1.2.
Modification de l'analyseur de l'exercice 2 / question 3 du TP4
fichier-lex :
%{
#include "y.tab.h"
%}
%%
a   return(lettrea);
b   return(lettreb);
\n  return(finligne);
.   { printf("%s: caractère inconnu\n",yytext); exit (-1); }
fichier-yacc:
%token lettrea lettreb finligne
%%
MOT : S finligne       { printf("mot accepté\n"); return 0; }
    | error finligne   { printf("mot refusé\n"); return 1; }
    ;
S : lettreb T
  | lettrea W
  ;
T : lettrea U
  | lettreb S
  |
  ;
U : lettrea T
  | lettreb W
  ;
W : lettrea S
  | lettreb U
  ;
%%
yyerror() {;}
main() {while (yyparse()>=0);}

Modification des analyseurs de l'exercice 3 du TP4 :
1°)
fichier-lex:
%{
#include "y.tab.h"
%}
%%
a   return(lettrea);
b   return(lettreb);
"(" return(ouvrante);
")" return(fermante);
\n  return(finligne);
.   { printf("%s: caractère inconnu\n",yytext); exit(-1); }
fichier-yac:
%token lettrea lettreb
%token ouvrante fermante
%token finligne
%left lettrea lettreb
%left ouvrante fermante
%%
LIGNE : T finligne      { printf("accepté\n"); return 0; }
      | error finligne  { printf("refusé\n"); return 1; }
      ;
T : lettrea T
  | lettreb T
  | T ouvrante T fermante T
  |
  ;
%%
yyerror() {;}
main() {while (yyparse()>=0);}

2°)
fichier-lex:
%{
#include "y.tab.h"
%}
%%
a  return(lettrea);
b  return(lettreb);
c  return(lettrec);
d  return(lettred);
\n return(finligne);
.  { printf("%s: caractère inconnu\n",yytext); exit(-1); }
fichier-yacc:
%token lettrea lettreb lettrec lettred
%token finligne
%left lettrea lettreb
%%
LIGNE : S finligne     { printf("accepté\n"); return 0; }
      | error finligne   { printf("refusé\n"); return 0; }
      ;
S : A B
  ;
A : lettrea
  | lettrea T lettrea
  ;
B : lettreb
  | lettreb T lettreb
  ;
T : lettrec
  | lettred
  | S
  ;
%%
yyerror(){;}
main(){while (yyparse()>=0);}

© 2000, 2017 – A. Sigayret