JAVA: подклассы, самообучение-тест, курсовая работа, домашняя работа - PullRequest
4 голосов
/ 26 января 2010

ПРИВЕТ ВСЕМ!

Как часть моего самообучения Java, я пытаюсь выполнить одно из доступных заданий для начинающих Java здесь (очень старые вещи - 2001)

Проблема в том, что я не знаю, как решить эту проблему :( Буду признателен за любые предложения, поскольку решение больше не доступно, отлично работает только ссылка на сжатые архивы .

С уважением, Mary

PS. Назначение:

** "** Задание 3: Задание по теме 3, подклассы

(это ревизия проекта, созданного Профессор Синди Норрис из CS, Аппалачский государственный университет)

Цель этого задания - дать вам возможность практиковаться с подклассами в обстановке, где они особенно полезны. Вы напишите переводчик для минимального машинного языка - MML. Общая форма обучения машинному языку

регистр инструкций метки-списка

метка - это метка для строки. Другие инструкции могут «перейти» к этому ярлыку.

инструкция является актуальной инструкцией. В MML есть инструкции для сложения, умножения и т. Д., Для хранения и извлечения целых чисел и для условного перехода к другим меткам (например, к оператору if).

register-list - это список регистров, которыми манипулирует инструкция. Регистры - это простые целочисленные области хранения в памяти компьютера, очень похожие на переменные. В MML есть 32 регистра, пронумерованных 0, 1, ..., 31.

MML имеет следующие инструкции:

L1 add r s1 s2 - добавить содержимое регистров s1 и s2 и сохранить результат в регистр r.

L1 sub r s1 s2 - Вычесть содержимое регистра s2 из содержимого s1 и сохранить результат в регистре r.

L1 mul r s1 s2 - Умножить содержимое регистров s1 и s2 и сохранить результат в регистре r.

L1 div r s1 s2 - Разделить (целочисленное деление Java) содержимое регистра s1 на содержимое регистра s2 и сохранить результат в регистре r.

L1 out s1 - Распечатать содержимое регистра s1 на консоли Java (используя println).

L1 lin r x - сохранить целое число x в регистре r.

L1 bnz s1 L2 Если содержимое регистра s1 не равно нулю, то оператор, помеченный L2, будет следующим, который будет выполнен.

Мы сохранили небольшое количество различных инструкций, чтобы у вас было меньше работы. Например, это могли быть другие инструкции перехода, инструкция отрицания, инструкция ввода и так далее. Но как только вы реализуете этот маленький язык, вам будет легко добавлять дополнительные инструкции.

L1 - любой идентификатор - фактически любая последовательность непробельных символов. Каждое утверждение программы должно быть помечено различным идентификатором. Каждый из s1, s2 и r является целым числом в диапазоне 0..31 и относится к одному из 32 регистров в машине, которая выполняет язык MML. Вот пример программы MML для вычисления факториала 6. Обратите внимание, что смежные поля инструкции (метка, код операции и операнды) разделены пробелами.

f0  lin 20 6
f1  lin 21 1
f2  lin 22 1
f3  mul 21 21 20
f4  sub 20 20 22
f5  bnz 20 f3
f6  out 21

Инструкции программы выполняются по порядку (начиная с первого), если только порядок не изменяется при выполнении команды bnz. Выполнение прекращается, когда выполняется его последняя инструкция (и не меняет порядок выполнения).

Ваш переводчик будет

  1. Получить от пользователя имя файла, содержащего программу,
  2. Считайте программу из файла и переведите ее во внутреннюю форму,
  3. Распечатать программу,
  4. Запустите программу и
  5. Вывести окончательное значение регистров. "

Machine.java

import java.util.*;

// The machine language interpreter
public class Machine {
    // The labels in the MML program, in the order in which
    // they appear (are defined) in the program
    private Labels labels= new Labels(); 

    // The MML program, consisting of prog.size() instructions, each
    // of class Instruction (or one of its subclasses)
    private Vector prog= new Vector();   

    // The registers of the MML machine
    private Registers registers;

    // The program counter; it contains the index (in prog) of
    // the next instruction to be executed.
    private int PC= 0;

    public static void main (String[] pars) {

        Machine m= new Machine();
        Translator.readAndTranslate(m.labels, m.prog);

        System.out.println("Here is the program; it has " +
      m.prog.size() + " instructions.");
        m.print();
        System.out.println();

        System.out.println("Beginning program execution.");
        m.execute();
 System.out.println("Ending program execution.");

        System.out.println("Values of registers at program termination:");
        System.out.println(m.registers + ".");
 System.exit(0);
    }

    // Print the program
    public void print() {
        for (int i= 0; i != prog.size(); i++) {
            System.out.println((Instruction) prog.elementAt(i));
        }
    }

    // Execute the program in prog, beginning at instruction 0.
    // Precondition: the program and its labels have been store properly.
    public void execute() {
 PC= 0;
 registers= new Registers();
 while (PC < prog.size()) {
     Instruction ins= (Instruction)prog.elementAt(PC);
     PC= PC+1;
     ins.execute(this);
 }
    }

    // = the registers of this machine
    public Registers getRegisters() {
 return registers;
    }

    // = the labels of this machine
    public Labels getLabels() {
 return labels;
    }

    // Set the program counter to pc
    public void setPC(int pc) {
 PC= pc;
    }
}

Translator.java

import  java.io.*;
import  java.util.*;
import  javax.swing.*;

// The translator of a small program. All the fields and methods are static.
public class Translator {
    private static BufferedReader br; // Reader attached to the file chosen by the user

    // word + line is the part of the current line that's not yet processed
    // word has no whitespace
    // If word and line are not empty, line begins with whitespace
    private static String line="";    
    private static String word=""; 

    private static Labels labels; // The labels of the program being translated 
    private static Vector program;   // The program to be created  

    // Obtain a file name from the user and translate the 
    // small program in that file into lab (the labels) and
    // prog (the program)
    // return "no errors were detected"
    public static boolean readAndTranslate(Labels lab, Vector prog) {
        try {
            getReader();
        } catch(IOException ioE) {
            System.out.println("Sai: IO error to start " );
            return false;
        }
        labels= lab;
        labels.reset();
        program= prog;
        program.removeAllElements();

        try { line = br.readLine();
        }
        catch (IOException ioE) {
            return false;
        }

        // Each iteration processes line and reads the next line into line
        while (line != null) {
            // Store the label in label
     String label= scan(); 

            if (label.length() > 0) {

                Instruction ins= getInstruction(label);
                if ( ins != null ) {
                    labels.addLabel(label); 
                    program.addElement(ins);  
                }
            }

            try { line = br.readLine();
            }
            catch (IOException ioE) {
                return false;
            }

        }
        return true;
    }

    // line should consist of an MML instruction, with its label already
    // removed. Translate line into an instruction with label label
    // and return the instruction
    public static Instruction getInstruction(String label) {
        int s1;   // Possible operands of the instruction
        int s2;
        int r;
        int x;
        String L2;

        String ins= scan();
        if (line.equals("")) return null;

        if (ins.equals("add")) {
            r= scanInt();
            s1= scanInt();
            s2= scanInt();
            return new AddInstruction(label, r, s1, s2);
        }

        // You will have to write code here for the other instructions.

        return null;
     }


     // Display a JFileChooser and set br to a reader for the file chosen
     private static void getReader() throws IOException {
       JFileChooser chooser = new JFileChooser("C:\\Windows\\Desktop\\compiler\\test0.txt");
       chooser.setDialogTitle("Choose the File that contains the MML program to be executed");
       chooser.showOpenDialog(null);
       br =  new BufferedReader(new FileReader(chooser.getSelectedFile()));
     }

    // Return the first word of line and remove it from line.
    // If there is no word, return ""
    public static String scan() {
        line= line.trim();
        if (line.length() == 0) 
            {   return "";   }
        int i= 0;
        while (i < line.length() &&
               line.charAt(i) != ' ' &&
               line.charAt(i) != '\t') {
            i= i+1;
        }
        word= line.substring(0,i);
        line= line.substring(i);
        return word;
    }

    // Return the first word of line as an integer. If there is
    // any error, return the maximum int
    public static int scanInt() {
        String word= scan();
        if (word.length() == 0)
            { return Integer.MAX_VALUE; }

        try {
            return Integer.parseInt(word);
        } catch (NumberFormatException e) {
            return Integer.MAX_VALUE;
        }
    }
}

Labels.java

import java.util.*;

// An instance contains a list of Strings, called "labels",
// in the order in which they were added to the list. 
public class Labels {
    private Vector labels= new Vector();

    // Constructor: an empty list of labels
    public Labels() {
    }

    // Add label lab to this list and return its number in the list
    // (the first one added is number 0)
    // Precondition: the list has at most 49 entries
    public int addLabel(String lab) {
        labels.addElement(lab);
        return labels.size()-1;
    }

    // = the number of label lab in the list
    //   (= -1 if lab is not in the list)
    public int indexOf(String lab) {

        // invariant: lab is not in labels[0..i-1]
        for (int i= 0; i != labels.size(); i++) {
            if (lab.equals((String)(labels.elementAt(i)))) {
                return i;
            }
        }   
        return -1;
    }

    // representation of this instance, "(label 0, label 1, ..., label (n-1))"
    public String toString() {
        String r= "(";
        // invariant: r contains the representation for labels[0..i-1]
        // (with the opening "(" but no closing ")")
        for (int i= 0; i != labels.size(); i++) {
            if (i == 0) {
                r= r + (String)(labels.elementAt(i));
            } else {
                r= r + ", " + (String)(labels.elementAt(i));
            }
        }
        r= r + ")";
        return r;
    }

    // Set the number of elements in the list to 0
    public void reset() {
        labels.removeAllElements();
    }
}

Registers.java

// An instance contains 31 registers and methods to access
// and change them
public class Registers {
    private int registers[]= new int[31];

    // Constructor: an instance whose registers are set to 0
    public Registers() {
        for (int i= 0; i != registers.length; i++) {
            registers[i]= 0;
        }
    }

    // = the value in register i.
    // Precondition: 0 <= i < 32
    public int getRegister(int i) {
        return registers[i];
    }

    // Set register i to v.
    // Precondition: 0 <= i < 32
    public void setRegister(int i, int v) {
        registers[i]= v;
    }

    // =  a representation of the registers,
    //    "(reg 0, reg 1, ..., reg 31)"
    public String toString() {
        String r= "(" + registers[0];
        // invariant: r contains the representation for registers[0..i-1]
        // (with the opening "(" but no closing ")")
        for (int i= 1; i != registers.length; i++) {
            r= r + ", " + registers[i];
        }
        r= r + ")";
        return r;
    }
}

Instruction.java

// This class is the superclass of the classes for machine instructions
public abstract class Instruction {

    // Constructor: an instruction with label l and opcode op
    // (op must be an operation of the language)
    public Instruction(String l, String op) {
    }

    // = the representation "label: opcode" of this Instruction
    public String toString() {
        return "";
    }

    // Execute this instruction on machine m. 
    public abstract void execute(Machine m);
}

1 Ответ

4 голосов
/ 26 января 2010

То, как выполняется задание, похоже, что вы должны подкласс Instruction - форекс:

public class AddInstruction implements Instruction{

    public AddInstruction(String l, int r, int s1, int s2) {
        // Store the stuff passed in
    }

    public void execute(Machine m) {
        Registers reg = m.getRegisters();
        reg.setRegister(r, reg.getRegister(s1) + reg.getRegister(s2));
    }
}
...