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));

        }

    }

}

#ip
START 100
MOVER AREG, ='5'
MOVEM AREG, ='1'
LTORG
ADD BREG, ='2'
SUB CREG, ='3'
LTORG
PRINT ='4'
STOP
END

Comments

Popular posts from this blog

literal

yacc evaluate

built in functions