You are on page 1of 1

%{

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int temp_counter = 1;
int lineno;

void gen_code(char* op, int arg1, int arg2, int result) {


printf("t%d = ", result);
if (strcmp(op, "+") == 0) {
printf("t%d + t%d", arg1, arg2);
} else if (strcmp(op, "-") == 0) {
printf("t%d - t%d", arg1, arg2);
} else if (strcmp(op, "*") == 0) {
printf("t%d * t%d", arg1, arg2);
} else if (strcmp(op, "/") == 0) {
printf("t%d / t%d", arg1, arg2);
}
printf("\n");
}

%}

%union {
int num;
}

%token <num> NUM


%token <num> ID
%type <num> exp

%%

stmt: exp { printf("t%d = %d\n", temp_counter++, $1); }


| exp '+' exp { gen_code("+", $1, $3, temp_counter++); }
| exp '-' exp { gen_code("-", $1, $3, temp_counter++); }
| exp '*' exp { gen_code("*", $1, $3, temp_counter++); }
| exp '/' exp { gen_code("/", $1, $3, temp_counter++); }
;

exp: NUM { $$ = $1; }


;

%%

int main() {
yyparse();
return 0;
}

int yyerror(char *msg) {


printf("Error at line %d: %s\n", lineno, msg);
exit(1);
}

You might also like