3ac

 

Three Address Code

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

Popular posts from this blog

literal

yacc evaluate

built in functions