mdt
import java.util.*;
import java.io.*;
class MacroDefinition {
String name;
List<String> parameters;
List<String> body;
int startIndex;
int endIndex;
public MacroDefinition(String name, int startIndex) {
this.name = name;
this.parameters = new ArrayList<>();
this.body = new ArrayList<>();
this.startIndex = startIndex;
this.endIndex = -1;
}
}
public class MacroProcessorMDT {
private List<String> inputLines = new ArrayList<>();
private Map<String, MacroDefinition> macroTable = new HashMap<>();
private List<String> mdtEntries = new ArrayList<>();
private int currentLine = 0;
public static void main(String[] args) {
MacroProcessorMDT processor = new MacroProcessorMDT();
processor.readInputFromTerminal();
processor.passOne();
processor.printMDT();
}
public void readInputFromTerminal() {
System.out.println("Enter your assembly code (type 'END' on a new line to finish):");
Scanner scanner = new Scanner(System.in);
while (true) {
String line = scanner.nextLine().trim();
if (line.equals("END")) {
inputLines.add(line);
break;
}
if (!line.isEmpty()) {
inputLines.add(line);
}
}
}
public void passOne() {
System.out.println("\nProcessing Macro Definitions...");
while (currentLine < inputLines.size()) {
String line = inputLines.get(currentLine);
if (line.startsWith("MACRO")) {
processMacroDefinition();
} else {
currentLine++;
}
}
}
private void processMacroDefinition() {
String macroDecl = inputLines.get(currentLine);
String[] parts = macroDecl.split("\\s+");
String macroName = parts[1];
MacroDefinition macro = new MacroDefinition(macroName, mdtEntries.size() + 1); // 1-based index
// Process parameters
if (parts.length > 2) {
for (int i = 2; i < parts.length; i++) {
String param = parts[i].replace(",", "");
macro.parameters.add(param);
}
}
currentLine++;
// Process macro body
while (currentLine < inputLines.size()) {
String line = inputLines.get(currentLine);
if (line.equals("MEND")) {
macro.endIndex = mdtEntries.size(); // Before adding MEND
mdtEntries.add("MEND");
break;
}
mdtEntries.add(line);
macro.body.add(line);
currentLine++;
}
macroTable.put(macroName, macro);
currentLine++; // Skip MEND line
}
public void printMDT() {
System.out.println("\n=== MACRO DEFINITION TABLE (MDT) ===");
System.out.printf("%-5s %-15s %-30s%n", "Index", "Macro Name", "Definition");
System.out.println("------------------------------------------------");
for (Map.Entry<String, MacroDefinition> entry : macroTable.entrySet()) {
MacroDefinition macro = entry.getValue();
System.out.printf("%-5d %-15s %-30s%n",
macro.startIndex,
macro.name,
"MACRO " + macro.name + " " + String.join(", ", macro.parameters));
for (int i = 0; i < macro.body.size(); i++) {
System.out.printf("%-5d %-15s %-30s%n",
macro.startIndex + i + 1,
"",
macro.body.get(i));
}
System.out.printf("%-5d %-15s %-30s%n",
macro.startIndex + macro.body.size() + 1,
"",
"MEND");
System.out.println("------------------------------------------------");
}
System.out.println("\n=== COMPLETE MDT LIST ===");
for (int i = 0; i < mdtEntries.size(); i++) {
System.out.printf("%3d: %s%n", i + 1, mdtEntries.get(i));
}
}
}
#ip
MACRO INCR &ARG
LOAD &ARG
ADD 1
STORE &ARG
MEND
MACRO SWAP &X, &Y
LOAD &X
STORE TEMP
LOAD &Y
STORE &X
LOAD TEMP
STORE &Y
MEND
END
Comments
Post a Comment