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();<br /> if ((i>='a' && i<='z')||i=='@'||i=='0') <br /> {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 :
----------
%{<br />#include "../AnalDesc/arbin.h"<br />void yyerror(char*);<br />int yylex();<br />char * invite="\nVeuillez saisir une expression régulière suivie de <Entrée> S.V.P.\n";<br />%}
%union { /* YYSTYPE */<br />Arbin a;<br />int i;<br />}
/* 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");<br /> ab_afficher($1);<br /> if (ab_racine($1)=='0'){<br /> puts("\nLe langage de l'expression régulière est vide !\n");<br /> }else{<br /> puts("\nConstruction de l'Automate ...\n");<br /> AFN b=afnCreer($1);<br /> ab_vider($1);<br /> afnAfficher(b);<br /> afnVider(b);<br /> }
}
;
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());}
;
%%