TP Analyse Ascendante en Bison d'expressions régulières avec une grammaire non ambigüe récursive à gauche

TP Analyse Ascendante en Bison d'expressions régulières avec une grammaire non ambigüe récursive à gauche

par Meynard Michel,
Nombre de réponses : 0

La grammaire :
-----------------------

u : u '|' c | c 
c : c e | e
e : e '*' | b
b : SYMBOLE | '(' u ')'

 
Les fonctions (Analyse lexicale etc.) :
-------------------------------------
int yylex(){int i=getchar();
if ((i>='a' && i<='z')||i=='@'||i=='0')
{yylval.i=i;return SYMBOLE;}
else return i;
}
void yyerror(char *s) {fprintf(stderr,"%s\n",s);}
int main(){/*yydebug=1;*/puts(invite);return yyparse();}

L'entête :
----------
%{
#include "../AnalDesc/arbin.h"
void yyerror(char*);
int yylex();
char * invite="\nVeuillez saisir une expression régulière suivie de <Entrée> S.V.P.\n";
%}
%union { /* YYSTYPE */
Arbin a;
int i;
}
/* definition des jetons */
%token<i> SYMBOLE
/* definition des types des non terminaux */
%type<a> u c e b
%%

A vous de jouer pour la partie règles ... ALLEZ JE VOUS AIDE !
------------------------------------------------------------
%%

liste   :       /* chaine vide sur fin de fichier Ctrl-D */
| liste ligne {puts(invite);}
;
ligne : '\n' /* ligne vide : expression vide */
| error '\n' {yyerrok; /* après la fin de ligne */}
| u '\n'
{ puts("Arbre binaire de l'expression régulière\n");
ab_afficher($1);
if (ab_racine($1)=='0'){
puts("\nLe langage de l'expression régulière est vide !\n");
}else{
puts("\nConstruction de l'Automate ...\n");
AFN b=afnCreer($1);
ab_vider($1);
afnAfficher(b);
afnVider(b);
}
}
;
u : u '|' c {\(= ab_construire('|',$1,$3);} // union
| c {\)
=$1;}
;
c : c e {\(= ab_construire('.',$1,$2);} // concat
| e {\)
=$1;}
;
e : e '*' {\(= ab_construire('*',$1,ab_creer());} // étoile
| b {\)
=$1;}
;
b : '(' u ')' {\(=$2;} // base
| SYMBOLE {\)
=ab_construire($1,ab_creer(),ab_creer());}
;
%%