3ac
Three Address Code
Java
Copy
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ThreeAddressCodeGenerator {
private String expr;
private int index;
private int tempCount;
private List<String> code;
private String assignmentLhs;
public ThreeAddressCodeGenerator(String expr) {
this.expr = expr.replaceAll("\\s+", "");
this.index = 0;
this.tempCount = 1;
this.code = new ArrayList<>();
this.assignmentLhs = null;
}
private String newTemp() {
String temp = "t" + tempCount;
tempCount++;
return temp;
}
private Character peek() {
return index < expr.length() ? expr.charAt(index) : null;
}
private Character get() {
Character ch = peek();
if (ch != null) {
index++;
}
return ch;
}
public List<String> parse() {
// Handle assignment like x = ...
if (expr.contains("=")) {
String[] parts = expr.split("=", 2);
assignmentLhs = parts[0];
expr = parts[1];
index = 0;
}
String result = expression();
if (assignmentLhs != null) {
code.add(assignmentLhs + " = " + result);
}
return code;
}
private String expression() {
String left = term();
while (peek() != null && (peek() == '+' || peek() == '-')) {
char op = get();
String right = term();
String temp = newTemp();
code.add(temp + " = " + left + " " + op + " " + right);
left = temp;
}
return left;
}
private String term() {
String left = factor();
while (peek() != null && (peek() == '*' || peek() == '/')) {
char op = get();
String right = factor();
String temp = newTemp();
code.add(temp + " = " + left + " " + op + " " + right);
left = temp;
}
return left;
}
private String factor() {
if (peek() != null && peek() == '(') {
get(); // consume '('
String val = expression();
get(); // consume ')'
return val;
} else {
StringBuilder val = new StringBuilder();
while (peek() != null && Character.isLetterOrDigit(peek())) {
val.append(get());
}
return val.toString();
}
}
public List<String> generate() {
parse();
return code;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter an expression (e.g., x = a+b*(c-d)): ");
String expr = scanner.nextLine();
ThreeAddressCodeGenerator tac = new ThreeAddressCodeGenerator(expr);
List<String> code = tac.generate();
System.out.println("\nThree Address Code:");
for (String line : code) {
System.out.println(line);
}
}
}
Comments
Post a Comment