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

Popular posts from this blog

literal

yacc evaluate

built in functions