%{ extern int yylex(); #include #include "proto-color.h" int yyerror (char const *message) { fprintf(stderr,RED("<%s>")"\n", message); return 0; } void print(char *msg) { fprintf(stderr,BLUE("%s"),msg); } %} %error-verbose %union { int entier; } %type Expr %token ENTIER /* Token et Operateur par priorité croissante */ /* les priorites et associativité levent les ambiguités */ /* sur l'interpretation de " x op1 y op2 z " */ %token '(' ')' '\n' %left '+' '-' %left '*' '/' '%' %% ExprList : /*mot vide */ | ExprList Expr '\n' {printf(" == %d\n", $2);} ; Expr : ENTIER { print("Val"); $$=$1; } | '(' Expr ')' { print("()"); $$=$2; } | Expr '+' Expr { print("+"); $$=$1+$3; } | Expr '-' Expr { print("-"); $$=$1-$3; } | Expr '*' Expr { print("*"); $$=$1*$3; } | Expr '/' Expr { print("/"); $$=$1/$3; } | Expr '%' Expr { print("%"); $$=$1%$3; } ; %% int main(void) { return yyparse(); }