%{ extern int yylex(); #include #include "proto-color.h" int yyerror (char const *message) { fprintf(stderr,RED("<%s>")"\n", message); return 0; } %} %error-verbose %token TOK '\n' %% Line : | Line list '\n' {printf(BLUE("Ligne OK")"\n");} | Line 'a' lista '\n' {printf(BLUE("Ligne OK: lista")"\n");} | Line 'b' listb '\n' {printf(BLUE("Ligne OK: listb")"\n");} | Line 'c' listc '\n' {printf(BLUE("Ligne OK: listc")"\n");} | Line 'd' listd '\n' {printf(BLUE("Ligne OK: listd")"\n");} | Line 'e' liste '\n' {printf(BLUE("Ligne OK: liste")"\n");} | Line 'f' listf '\n' {printf(BLUE("Ligne OK: listf")"\n");} | Line 'g' listg '\n' {printf(BLUE("Ligne OK: listg")"\n");} | Line 'h' listh '\n' {printf(BLUE("Ligne OK: listh")"\n");} | Line 'i' listi '\n' {printf(BLUE("Ligne OK: listi")"\n");} | Line 'j' listj '\n' {printf(BLUE("Ligne OK: listj")"\n");} | Line 'k' listk '\n' {printf(BLUE("Ligne OK: listk")"\n");} | Line error '\n' { yyerrok; {printf(RED("Ligne incorrecte")"\n");} } ; list : lista lista : TOK {printf(GREEN("%d "),$1);} | lista TOK {printf(" %d ",$2);} // Liste non vide recursive gauche ; listb : TOK {printf(GREEN("%d "),$1);} | TOK listb {printf(" %d ",$1);} // Liste non vide recursive droite ; listc : TOK {printf(GREEN("%d "),$1); $$=1;} | listc listc {$$=$1+$2; printf( "Tailles L1=%d + L2=%d ", $1,$2);} // Liste non vide ambigue ; listd : /* mot vide !! */ | listd TOK {printf(GREEN("%d "),$2);} // Liste eventuellement vide recursive gauche ; // listdbis : /* mot vide*/ // | lista // // Variante Liste eventuellement vide recursive gauche // ; liste : TOK | liste ',' TOK // Liste non vide avec separateur rec. gauche ; listf : TOK | TOK ',' listf // Liste non vide avec separateur rec. droit ; listg : /* mot vide */ | listg ',' TOK // Liste FAUSSE !! eventuellement vide avec separateur rec. gauche ; listh : /* mot vide */ | TOK ',' listh // Liste FAUSSE !! eventuellement vide avec separateur rec. droit! ; listi : /* mot vide */ | liste // Liste correcte eventuellement vide avec separateur rec. gauche ; listj : /*vide */ | TOK ';' listj {printf(GREEN("%d "),$1);} // Liste eventuellement vide avec terminateur rec. droit ; listk : /*vide */ | listk TOK ';' {printf(GREEN("%d "),$2);} // Liste eventuellement vide avec terminateur rec. gauche ; %% int main(void) { return yyparse(); }