%{ #include #include #include "lse_syntabstr.tic.h" extern void yyerror(char const *); extern int yylineno; extern FILE * yyin; %} %union { char* str; int num; union e_expr *e; union b_expr *b; } %left PLUS %token LPAR RPAR %token IF ELSE %token THEN %token LET EQ IN %token ID %token CONST %type e_expression %type b_expression %start S %% S: b_expression; b_expression: e_expression {$$=makeExpr($1);} | LPAR b_expression RPAR {$$=$2;} | LET ID EQ e_expression IN b_expression {$$=makeLet($2,$4,$6);} | IF e_expression THEN b_expression ELSE b_expression {$$=makeIte($2,$4,$6);} ; e_expression: ID {$$=makeId($1);} | CONST {$$=makeConst($1);} | e_expression PLUS e_expression {$$=makePlus($1,$3);} | LPAR e_expression RPAR {$$=$2;} ; %% void yyerror(char const *str) { fprintf(stderr,"Ligne %d : %s\n", yylineno, str); exit(EXIT_FAILURE); } int main(int argc, char* argv[]) { if ( argc > 1 ) { if((yyin = fopen( argv[1], "r" ))==NULL) exit(EXIT_FAILURE); yyparse(); fclose(yyin); } else exit(EXIT_FAILURE); exit(EXIT_SUCCESS); }