Para la lista de instrucciones a ser ejecutada se crea una clase llamada Instrucción que cuenta básicamente con dos atributos, el tipo de instrucción y el índice del elemento en su respectiva tabla que va a ser operado con dicha instrucción. Los diferentes tipos de instrucción se definen con una enumeración así:
package maquinavirtual; public enum TipoInstruccion { PUSH, vPUSH, nPUSH, STORE, ADD, SUB, DIV, MUL, GT, GE, LE, LT, EQ, NE, JZERO, GOTO, WRITE }
Por su parte, la clase Instrucción queda definida de la siguiente manera:
package maquinavirtual; public class Instruccion { TipoInstruccion tipo; int operando; Instruccion(TipoInstruccion t, int op) { tipo=t; operando=op; } Instruccion(TipoInstruccion t) { this(t,-1); } public String toString() { return String.format("%-10s %d", tipo, operando); } }
La clase MaquinaVirtual, definida a continuación, define un lista o vector de objetos de la clas Instruccion que representará la lista de instrucciones a ser ejecutada; una pila de objetos Double para manejar la pila; una lista de String para la lista de variables definidas; una lista de Doubles para las constantes y un Mapa de Integer y Double para manejar los valores de las diferentes variables.
Esta clase tiene dos métodos principales: el método cargarArchivo que se encarga de leer un archivo de texto que trae codificado un programa en el lenguaje de la máquina virtual y alimenta la lista de variables, la lista de constantes y la lista de instrucciones a ser ejecutadas; y por otra parte está el método ejecutar que se encarga de leer la lista de instrucciones y recorrerla ejecutándolas.
package maquinavirtual; import java.util.*; import java.io.*; public class MaquinaVirtual { Stack<Double> pila = new Stack<Double>(); // Pila Vector<Instruccion> listaInstrucciones = new Vector<Instruccion>(); // Programa a ejecutar Vector<Double> listaNumeros = new Vector<Double>(); // Tabla de numeros Vector<String> listaVariables = new Vector<String>(); // Tabla de variables Map<Integer,Double> tablaVariables = new HashMap<Integer,Double>(); // Valores de las variables public void mostrarValores() { System.out.println("\nLista de Instrucciones"); for(Instruccion i: listaInstrucciones) System.out.println(i); System.out.println("\nLista de Variables"); for(String i: listaVariables) System.out.println(i); System.out.println("\nLista de Numeros"); for(Double i: listaNumeros) System.out.println(i); } public void ejecutar() { for(int i=0; i<listaInstrucciones.size(); i++) { Instruccion inst = listaInstrucciones.elementAt(i); //System.out.println("Inst: " +inst); TipoInstruccion t = inst.tipo; int op = inst.operando; double a, b; switch(t) { case ADD: b=pila.pop(); a=pila.pop(); pila.push(a+b); break; case SUB: b=pila.pop(); a=pila.pop(); pila.push(a-b); break; case MUL: b=pila.pop(); a=pila.pop(); pila.push(a*b); break; case DIV: b=pila.pop(); a=pila.pop(); pila.push(a/b); break; case GT: b=pila.pop(); a=pila.pop(); pila.push(a>b ?1.0:0.0); break; case GE: b=pila.pop(); a=pila.pop(); pila.push(a>=b?1.0:0.0); break; case LT: b=pila.pop(); a=pila.pop(); pila.push(a<b ?1.0:0.0); break; case LE: b=pila.pop(); a=pila.pop(); pila.push(a<=b?1.0:0.0); break; case EQ: b=pila.pop(); a=pila.pop(); pila.push(a==b?1.0:0.0); break; case NE: b=pila.pop(); a=pila.pop(); pila.push(a!=b?1.0:0.0); break; case WRITE: System.out.println(pila.pop()); break; case nPUSH: pila.push(listaNumeros.elementAt(op)); break; case vPUSH: pila.push(tablaVariables.get(op)); break; case STORE: tablaVariables.put(op, pila.pop()); break; case GOTO: i=(int) (listaNumeros.get(op)-2); break; case JZERO: if(pila.pop()==0.0) i=(int) (listaNumeros.get(op)-2); break; } } } public void cargarArchivo(String nombreArchivo) { try { BufferedReader in = new BufferedReader(new FileReader(nombreArchivo)); Instruccion inst=null; TipoInstruccion t=null; int posicion=-1; while(true) { String linea = in.readLine(); if(linea==null) break; String[] elementos = linea.trim().split("\\s+"); try { t = TipoInstruccion.valueOf(elementos[0].toUpperCase()); if(elementos.length==1) { inst = new Instruccion(t); listaInstrucciones.add(inst); } else if(elementos.length==2) { // El segundo componente es un número if(elementos[1].matches("\\d+(\\.\\d*)?")) { Double numero = Double.parseDouble(elementos[1]); if(!listaNumeros.contains(numero)) listaNumeros.add(numero); posicion=listaNumeros.indexOf(numero); if(t==TipoInstruccion.PUSH) t=TipoInstruccion.nPUSH; } // Si el segundo componente es una variable else if(elementos[1].matches("\\p{Alpha}\\w*")) { if(!listaVariables.contains(elementos[1])) listaVariables.add(elementos[1]); posicion=listaVariables.indexOf(elementos[1]); if(t==TipoInstruccion.PUSH) t=TipoInstruccion.vPUSH; } else { System.err.println("Elemento desconocido: " + elementos[1]); System.exit(0); } inst = new Instruccion(t, posicion); listaInstrucciones.add(inst); } } catch(IllegalArgumentException ex) { System.err.println("Error, instruccion no reconocida: " + elementos[0]); System.exit(0); } } } catch(Exception x) { System.err.println("Error de algun tipo: " + x.getMessage()); } } }
timberland shoes
ResponderBorrarmichael kors outlet store
nike cortez women
coach outlet online
nike air max 2019
nike air max 270
hermes online
longchamp bags
nike air max
yeezy shoes
xiaofang20191218