pool and literal
import java.util.*;
class Literal {
String value;
int address;
Literal(String value) {
this.value = value;
this.address = -1;
}
}
public class Ass3{
public static boolean exists(List<Literal> list, String value) {
for (Literal l : list) {
if (l.value.equals(value)) return true;
}
return false;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<String> code = new ArrayList<>();
List<Literal> literalTable = new ArrayList<>();
List<Literal> literalPool = new ArrayList<>();
List<Integer> poolTable = new ArrayList<>();
poolTable.add(0);
System.out.println("Enter Assembly Code (type END on a new line to finish):");
while (true) {
String line = scanner.nextLine().trim();
if (line.equalsIgnoreCase("END")) {
code.add("END");
break;
}
if (!line.isEmpty()) code.add(line);
}
int locationCounter = 0;
boolean startFound = false;
for (String stmt : code) {
String[] tokens = stmt.trim().split("\\s+");
if (tokens.length == 0) continue;
if (tokens[0].equalsIgnoreCase("START")) {
if (tokens.length > 1) {
locationCounter = Integer.parseInt(tokens[1]);
startFound = true;
continue;
} else {
System.out.println("Error: START must be followed by address");
return;
}
}
if (!startFound) {
System.out.println("Error: START not found.");
return;
}
if (tokens[0].equalsIgnoreCase("LTORG") || tokens[0].equalsIgnoreCase("END")) {
for (Literal lit : literalPool) {
lit.address = locationCounter++;
literalTable.add(lit);
}
literalPool.clear();
if (!tokens[0].equalsIgnoreCase("END")) {
poolTable.add(literalTable.size());
}
continue;
}
for (String token : tokens) {
if (token.startsWith("='")) {
if (!exists(literalTable, token) && !exists(literalPool, token)) {
literalPool.add(new Literal(token));
}
}
}
locationCounter++;
}
System.out.println("\n--- LITERAL TABLE ---");
System.out.printf("%-10s %-10s %-10s\n", "Index", "Literal", "Address");
for (int i = 0; i < literalTable.size(); i++) {
Literal l = literalTable.get(i);
System.out.printf("%-10d %-10s %-10d\n", i, l.value, l.address);
}
System.out.println("\n--- POOL TABLE ---");
System.out.printf("%-10s %-20s\n", "Pool#", "Start Index");
for (int i = 0; i < poolTable.size(); i++) {
System.out.printf("%-10d %-20d\n", i + 1, poolTable.get(i));
}
}
}
Comments
Post a Comment