%{ /*========== Section : Definitions =============*/ #include extern int yylex(); int yyerror (char const *message) { fputs (message, stderr); fputc ('\n', stderr); return 0; } %} %error-verbose /* message d'erreur plus complet */ %start var2 /* Definition de l'Axiome, sinon par defaut 1ere regles */ %token TOK1 TOK2 '\n' '+' /* Declaration des symboles terminaux (cf. partie 2)*/ /* Typage des valeurs de symboles term. ou non-term, (cf. partie 4) */ %union { type1 selecteur1; type2 selecteur2; } %token TOK3 %type var1 /* Declaration de tokens avec priorité et associativité ( cf. partie 5) */ %left TOK4 %right TOK6 %nonassoc TOK7 %% /*========== Section : Regles de grammaire ==========*/ var1 : /* mot vide ! */ {$$=0;} | TOK1 var2 TOK2 '\n' { /* Action */ } | var2 TOK3 var1 '*' TOK4 { $$ = fonct($2,$3,$5); /* cf partie 4 */ } | error TOK6 { yyerrok; /* cf partie 3 */ } ; var2 : TOK7 var1 TOK6 { /* ... */} %% /*========== Section : Code utilisateur =============*/ int main(void) { return yyparse(); }