lex

%{
#include "y.tab.h"
#include <stdlib.h>
#include <string.h>
%}

%%
[a-zA-Z_][a-zA-Z0-9_]*  { yylval.text = strdup(yytext); return ID; }
[0-9]+                  { yylval.text = strdup(yytext); return NUM; }
[ \\t\\r\\n]+              { /* skip whitespace */ }
.                       { return yytext[0]; }
%%

int yywrap(void)
{
    return 1;
}

yacc

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

int yylex(void);
void yyerror(const char *s);

struct quad {
    char op[5], a1[20], a2[20], res[20];
} q[100];

int i = 0, t = 0;

char* newtemp() {
    char *s = malloc(10);
    sprintf(s, "t%d", t++);
    return s;
}

char* emit(char *op, char *a1, char *a2) {
    char *tmp = newtemp();
    strcpy(q[i].op, op);
    strcpy(q[i].a1, a1);
    strcpy(q[i].a2, a2);
    strcpy(q[i].res, tmp);
    i++;
    return tmp;
}

void assign(char *l, char *r) {
    strcpy(q[i].op, "=");
    strcpy(q[i].a1, r);
    strcpy(q[i].res, l);
    i++;
}

void print() {
    int j;

    printf("\\nThree Address Code:\\n");
    for (j = 0; j < i; j++) {
        if (strcmp(q[j].op, "=") == 0)
            printf("%s = %s\\n", q[j].res, q[j].a1);
        else
            printf("%s = %s %s %s\\n", q[j].res, q[j].a1, q[j].op, q[j].a2);
    }

    printf("\\nQuadruples:\\n");
    printf("Index\\tOp\\tArg1\\tArg2\\tResult\\n");
    for (j = 0; j < i; j++) {
        printf("%d\\t%s\\t%s\\t%s\\t%s\\n",
            j, q[j].op, q[j].a1, q[j].a2, q[j].res);
    }

    printf("\\nTriples:\\n");
    printf("Index\\tOp\\tArg1\\tArg2\\n");
    for (j = 0; j < i; j++) {
        if (strcmp(q[j].op, "=") == 0)
            printf("%d\\t=\\t%s\\t%s\\n", j, q[j].a1, q[j].res);
        else
            printf("%d\\t%s\\t%s\\t%s\\n", j, q[j].op, q[j].a1, q[j].a2);
    }
}
%}

%union { char* text; }

%token <text> ID NUM
%type <text> expr term factor
%left '+' '-'
%left '*' '/'

%%

program : stmt_list { print(); };

stmt_list : stmt_list stmt | stmt;

stmt : ID '=' expr ';' { assign($1, $3); };

expr : expr '+' term { $$ = emit("+", $1, $3); }
     | expr '-' term { $$ = emit("-", $1, $3); }
     | term { $$ = $1; };

term : term '*' factor { $$ = emit("*", $1, $3); }
     | term '/' factor { $$ = emit("/", $1, $3); }
     | factor { $$ = $1; };

factor : '(' expr ')' { $$ = $2; }
       | ID { $$ = $1; }
       | NUM { $$ = $1; };

%%

void yyerror(const char *s) {
    printf("Error in input\\n");
}

int main() {
    printf("Enter expressions:\\n");
    yyparse();
    return 0;
}

a = b + c * d;

Three Address Code: T = c * d U = b + T a = U

Quadruple: 0 * c d T 1 + b T U 2 = a U

Triple: 0 * c d 1 + b T 2 = a U