#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Structure to represent a three-address code instruction
typedef struct Instruction {
char operator[5];
char operand1[10];
char operand2[10];
char result[10];
} Instruction;
// Function to generate three-address code for an expression
void generateTAC(char *expression, Instruction *instructions, int *count) {
char *token;
char *rest = expression;
char operators[10];
char operands[10][10];
int top_op = -1;
int top_val = -1;
int temp_count = 1;
// Tokenize the expression
while ((token = strtok_r(rest, " ", &rest)) != NULL) {
if (token[0] == '+' || token[0] == '-' || token[0] == '*' || token[0] == '/') {
operators[++top_op] = token[0];
} else if (token[0] >= 'a' && token[0] <= 'z') {
strcpy(operands
[++top_val
], token
); }
}
// Generate three-address code
while (top_op >= 0) {
Instruction instruction;
char temp[10];
// Pop operator and operands
char op = operators[top_op--];
char *operand2 = operands[top_val--];
char *operand1 = operands[top_val--];
// Create temporary variable
sprintf(temp
, "t%d", temp_count
++);
// Fill instruction fields
sprintf(instruction.
operator, "%c", op
); strcpy(instruction.
operand1, operand1
); strcpy(instruction.
operand2, operand2
); strcpy(instruction.
result, temp
);
// Add instruction to the list
instructions[(*count)++] = instruction;
// Push result back to operands stack
strcpy(operands
[++top_val
], temp
); }
}
int main() {
char expression[100];
Instruction instructions[100];
int instruction_count = 0;
// Get expression from user
printf("Enter an arithmetic expression (e.g., a + b * c): "); fgets(expression
, sizeof(expression
), stdin
); expression
[strcspn(expression
, "\n")] = 0; // Remove trailing newline
// Generate three-address code
generateTAC(expression, instructions, &instruction_count);
// Print three-address code
printf("\nThree-Address Code:\n"); for (int i = 0; i < instruction_count; i++) {
printf("%s = %s %s %s\n", instructions
[i
].
result, instructions
[i
].
operand1, instructions[i].operator, instructions[i].operand2);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLy8gU3RydWN0dXJlIHRvIHJlcHJlc2VudCBhIHRocmVlLWFkZHJlc3MgY29kZSBpbnN0cnVjdGlvbgp0eXBlZGVmIHN0cnVjdCBJbnN0cnVjdGlvbiB7CiAgICBjaGFyIG9wZXJhdG9yWzVdOwogICAgY2hhciBvcGVyYW5kMVsxMF07CiAgICBjaGFyIG9wZXJhbmQyWzEwXTsKICAgIGNoYXIgcmVzdWx0WzEwXTsKfSBJbnN0cnVjdGlvbjsKCi8vIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRocmVlLWFkZHJlc3MgY29kZSBmb3IgYW4gZXhwcmVzc2lvbgp2b2lkIGdlbmVyYXRlVEFDKGNoYXIgKmV4cHJlc3Npb24sIEluc3RydWN0aW9uICppbnN0cnVjdGlvbnMsIGludCAqY291bnQpIHsKICAgIGNoYXIgKnRva2VuOwogICAgY2hhciAqcmVzdCA9IGV4cHJlc3Npb247CiAgICBjaGFyIG9wZXJhdG9yc1sxMF07CiAgICBjaGFyIG9wZXJhbmRzWzEwXVsxMF07CiAgICBpbnQgdG9wX29wID0gLTE7CiAgICBpbnQgdG9wX3ZhbCA9IC0xOwogICAgaW50IHRlbXBfY291bnQgPSAxOwoKICAgIC8vIFRva2VuaXplIHRoZSBleHByZXNzaW9uCiAgICB3aGlsZSAoKHRva2VuID0gc3RydG9rX3IocmVzdCwgIiAiLCAmcmVzdCkpICE9IE5VTEwpIHsKICAgICAgICBpZiAodG9rZW5bMF0gPT0gJysnIHx8IHRva2VuWzBdID09ICctJyB8fCB0b2tlblswXSA9PSAnKicgfHwgdG9rZW5bMF0gPT0gJy8nKSB7CiAgICAgICAgICAgIG9wZXJhdG9yc1srK3RvcF9vcF0gPSB0b2tlblswXTsKICAgICAgICB9IGVsc2UgaWYgKHRva2VuWzBdID49ICdhJyAmJiB0b2tlblswXSA8PSAneicpIHsKICAgICAgICAgICAgc3RyY3B5KG9wZXJhbmRzWysrdG9wX3ZhbF0sIHRva2VuKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gR2VuZXJhdGUgdGhyZWUtYWRkcmVzcyBjb2RlCiAgICB3aGlsZSAodG9wX29wID49IDApIHsKICAgICAgICBJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbjsKICAgICAgICBjaGFyIHRlbXBbMTBdOwoKICAgICAgICAvLyBQb3Agb3BlcmF0b3IgYW5kIG9wZXJhbmRzCiAgICAgICAgY2hhciBvcCA9IG9wZXJhdG9yc1t0b3Bfb3AtLV07CiAgICAgICAgY2hhciAqb3BlcmFuZDIgPSBvcGVyYW5kc1t0b3BfdmFsLS1dOwogICAgICAgIGNoYXIgKm9wZXJhbmQxID0gb3BlcmFuZHNbdG9wX3ZhbC0tXTsKCiAgICAgICAgLy8gQ3JlYXRlIHRlbXBvcmFyeSB2YXJpYWJsZQogICAgICAgIHNwcmludGYodGVtcCwgInQlZCIsIHRlbXBfY291bnQrKyk7CgogICAgICAgIC8vIEZpbGwgaW5zdHJ1Y3Rpb24gZmllbGRzCiAgICAgICAgc3ByaW50ZihpbnN0cnVjdGlvbi5vcGVyYXRvciwgIiVjIiwgb3ApOwogICAgICAgIHN0cmNweShpbnN0cnVjdGlvbi5vcGVyYW5kMSwgb3BlcmFuZDEpOwogICAgICAgIHN0cmNweShpbnN0cnVjdGlvbi5vcGVyYW5kMiwgb3BlcmFuZDIpOwogICAgICAgIHN0cmNweShpbnN0cnVjdGlvbi5yZXN1bHQsIHRlbXApOwoKICAgICAgICAvLyBBZGQgaW5zdHJ1Y3Rpb24gdG8gdGhlIGxpc3QKICAgICAgICBpbnN0cnVjdGlvbnNbKCpjb3VudCkrK10gPSBpbnN0cnVjdGlvbjsKCiAgICAgICAgLy8gUHVzaCByZXN1bHQgYmFjayB0byBvcGVyYW5kcyBzdGFjawogICAgICAgIHN0cmNweShvcGVyYW5kc1srK3RvcF92YWxdLCB0ZW1wKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBjaGFyIGV4cHJlc3Npb25bMTAwXTsKICAgIEluc3RydWN0aW9uIGluc3RydWN0aW9uc1sxMDBdOwogICAgaW50IGluc3RydWN0aW9uX2NvdW50ID0gMDsKCiAgICAvLyBHZXQgZXhwcmVzc2lvbiBmcm9tIHVzZXIKICAgIHByaW50ZigiRW50ZXIgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uIChlLmcuLCBhICsgYiAqIGMpOiAiKTsKICAgIGZnZXRzKGV4cHJlc3Npb24sIHNpemVvZihleHByZXNzaW9uKSwgc3RkaW4pOwogICAgZXhwcmVzc2lvbltzdHJjc3BuKGV4cHJlc3Npb24sICJcbiIpXSA9IDA7IC8vIFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lCgogICAgLy8gR2VuZXJhdGUgdGhyZWUtYWRkcmVzcyBjb2RlCiAgICBnZW5lcmF0ZVRBQyhleHByZXNzaW9uLCBpbnN0cnVjdGlvbnMsICZpbnN0cnVjdGlvbl9jb3VudCk7CgogICAgLy8gUHJpbnQgdGhyZWUtYWRkcmVzcyBjb2RlCiAgICBwcmludGYoIlxuVGhyZWUtQWRkcmVzcyBDb2RlOlxuIik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RydWN0aW9uX2NvdW50OyBpKyspIHsKICAgICAgICBwcmludGYoIiVzID0gJXMgJXMgJXNcbiIsIGluc3RydWN0aW9uc1tpXS5yZXN1bHQsIGluc3RydWN0aW9uc1tpXS5vcGVyYW5kMSwKICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zW2ldLm9wZXJhdG9yLCBpbnN0cnVjdGlvbnNbaV0ub3BlcmFuZDIpOwogICAgfQoKICAgIHJldHVybiAwOwp9