%{ 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); } struct { float val; int init; } Table_Symb[26]; #include "arbre.h" %} %error-verbose %union { int entier; float flottant; int index; arbre AST; } %type Expr Min_Args %token F_MIN F_MAX %token FLOTTANT %token ENTIER %token VAR %token '(' ')' '\n' %right '=' %left '+' '-' %left '*' '/' '%' %left UMINUS %left '^' %% ExprList : //Mot vide | ExprList '\n' // Ligne vide | ExprList Expr '\n' {print_arbre_height($2);} | ExprList error '\n' {yyerrok; printf(RED(" Ligne invalid\n"));} ; Expr : FLOTTANT {$$=N("Float");} | ENTIER {$$=N("int");} | VAR {$$=N("Var");} | VAR '=' Expr {$$=N("R=",F("Var"),F("="),$3);} | '(' Expr ')' {$$=N("R()",F("("),$2,F(")")); } | Expr '+' Expr { $$=N("R+",$1,F("+"),$3); } | Expr '-' Expr { $$=N("R-",$1,F("-"),$3); } | Expr '*' Expr { $$=N("R*",$1,F("*"),$3); } | Expr '/' Expr { $$=N("R/",$1,F("/"),$3); } | Expr '^' Expr { $$=N("R^",$1,F("^"),$3); } | ENTIER '%' ENTIER { $$=N("R%",$1,F("%"),$3); } | '-' Expr { $$=N("Rumin",F("-"), $2); } | F_MAX '(' Expr ',' Expr ')' { $$=N("RMax",F("Max"),F("("), $3, F(","),$5, F(")")); } | F_MIN '(' Min_Args ')' { $$=N("RMin",F("Min"),F("("), $3, F(")")); } ; Min_Args : Expr {$$=N("MArg0",$1);} | Min_Args ',' Expr {$$=N("MArg",$1,F(","),$3);} ; %% int main(void) { return yyparse(); }