/** * Método que ejecuta la instrucción si..entonces, es una sobreescritura del * método ejecutar que se debe programar por la implementación de la interfaz * instrucción * @param ts tabla de símbolos del ámbito padre de la sentencia. * @return Estra instrucción retorna nulo porque no produce ningún valor en * su ejecución */ public Object ejecutar(TablaDeSimbolos ts) { if ((Boolean)condicion.ejecutar(ts)) { TablaDeSimbolos tablaLocal = new TablaDeSimbolos(); foreach (Simbolo item in ts) { tablaLocal.AddLast(item); } foreach (Instruccion ins in listaInstrucciones) { ins.ejecutar(tablaLocal); } } else { if (listaInsElse != null) { TablaDeSimbolos tablaLocal = new TablaDeSimbolos(); foreach (Simbolo item in ts) { tablaLocal.AddLast(item); } foreach (Instruccion ins in listaInsElse) { ins.ejecutar(tablaLocal); } } } return(null); }
/** * Método que ejecuta la instrucción operación, es una sobreescritura del * método ejecutar que se debe programar por la implementación de la interfaz * instrucción * @param ts tabla de símbolos del ámbito padre de la sentencia * @return Esta instrucción retorna el valor producido por la operación que se ejecutó */ public Object ejecutar(TablaDeSimbolos ts) { if (tipo == Tipo_operacion.DIVISION) { return((Double)operadorIzq.ejecutar(ts) / (Double)operadorDer.ejecutar(ts)); } else if (tipo == Tipo_operacion.MULTIPLICACION) { return((Double)operadorIzq.ejecutar(ts) * (Double)operadorDer.ejecutar(ts)); } else if (tipo == Tipo_operacion.RESTA) { return((Double)operadorIzq.ejecutar(ts) - (Double)operadorDer.ejecutar(ts)); } else if (tipo == Tipo_operacion.SUMA) { return((Double)operadorIzq.ejecutar(ts) + (Double)operadorDer.ejecutar(ts)); } else if (tipo == Tipo_operacion.NEGATIVO) { return((Double)operadorIzq.ejecutar(ts) * -1); } else if (tipo == Tipo_operacion.NUMERO) { return(Double.Parse(valor.ToString())); } else if (tipo == Tipo_operacion.IDENTIFICADOR) { return(ts.getValor(valor.ToString())); } else if (tipo == Tipo_operacion.CADENA) { return(valor.ToString()); } else if (tipo == Tipo_operacion.MAYOR_QUE) { return(((Double)operadorIzq.ejecutar(ts)) > ((Double)operadorDer.ejecutar(ts))); } else if (tipo == Tipo_operacion.MENOR_QUE) { return(((Double)operadorIzq.ejecutar(ts)) < ((Double)operadorDer.ejecutar(ts))); } else if (tipo == Tipo_operacion.CONCATENACION) { return(operadorIzq.ejecutar(ts).ToString() + operadorDer.ejecutar(ts).ToString()); } else { return(null); } }
/** * Método que ejecuta la accion de asignar un valor, es una sobreescritura del * método ejecutar que se debe programar por la implementación de la interfaz * instrucción * @param ts tabla de símbolos del ámbito padre de la sentencia asignación * @return En este caso retorna nulo porque no es una sentencia que genere un valor. */ public Object ejecutar(TablaDeSimbolos ts) { ts.setValor(id, valor.ejecutar(ts)); return(null); }