%{ extern int yylex(); #include #include "proto-color.h" int yyerror (char const *message) { fprintf(stderr,RED("<%s>")"\n", message); return 0; } %} %error-verbose %token GA MEU BU ZO '\n' %% Ligne : | Ligne Expr '\n' {printf(" Syntaxe OK \n");} | Ligne error '\n' {yyerrok; printf(" ERREUR SYNTAXE \n");} ; Expr : | Expr GA Expr MEU | Expr BU Expr ZO ; %% int main(void) { return yyparse(); } /* Autre ecriture possible (wikipedia "langage de Dyck"): expr : | expr prim prim : GA expr MEU | BU expr ZO */ /* NB: une regle de concatenation sous la forme EXPR : EXPR EXPR est "hautement" ambigue. Par contre, comme on l'a deja fait pour definir une "liste de" ou une "concatenation de ligne" ou un "{EXPR}*", on a une description non ambigue par recursivite gauche (ou eventuelement droite) avec "EXPR : EXPR ELEM | init " et init etant ELEM ou vide suivant que l'on admet ou pas la "concatenation vide" */