public MaquinaDeTuring Step() { try { Transicion transicionDeLaTabla = ObtenerSiguienteTransicion(EstadoActual, Cabezal.Leer()); IndiceEnLaTablaAnterior = IndiceEnLaTabla; IndiceEnLaTabla = transicionDeLaTabla.RowIndex; Cabezal.Escribir(transicionDeLaTabla.Escribir); Cabezal.Moverse(transicionDeLaTabla.Direccion); EstadoActual = transicionDeLaTabla.EstadoSiguiente; IndiceEnLaTabla = transicionDeLaTabla.RowIndex; Pasos++; return(this); } catch (ArgumentException) { throw; } catch (Exception) { throw; } }
public Transicion ObtenerSiguienteTransicion(string estadoActual, char charALeer) { try { Transicion transicionDeLaTabla = TablaTransiciones.FirstOrDefault(t => t.Estado == estadoActual && t.Leer == charALeer); if (transicionDeLaTabla == null) { throw new ArgumentException(string.Format("No se encontró una transición válida para el estado '{0}' leyendo el caracter '{1}'.", estadoActual, charALeer)); } bool puedoMoverme = true; if (transicionDeLaTabla.Direccion == Direccion.Derecha) { puedoMoverme = Cabezal.PuedoMovermeALaDerecha(); if (!puedoMoverme) { throw new ArgumentException(string.Format( "No se encontró una transición válida para el estado '{0}' leyendo el caracter '{1}'." + " El cabezal no se puede mover más hacia la derecha.", estadoActual, charALeer)); } return(transicionDeLaTabla); } else { puedoMoverme = Cabezal.PuedoMovermeALaIzquierda(); if (!puedoMoverme) { throw new ArgumentException(string.Format( "No se encontró una transición válida para el estado '{0}' leyendo el caracter '{1}'." + " El cabezal no se puede mover más hacia la izquierda.", estadoActual, charALeer)); } return(transicionDeLaTabla); } } catch (ArgumentException) { throw; } catch (Exception) { throw; } }
public MaquinaDeTuring(string estadoActual, Cabezal cabezal, DataGridView dataGridView, int intervaloDeTiempo) { try { TablaTransiciones = Utilidades.Utilidades.GenerarTablaDeTransiciones(dataGridView); Transicion transicionInicial = TablaTransiciones.FirstOrDefault(t => t.Estado == estadoActual && t.Leer == cabezal.Leer()); if (transicionInicial == null) { throw new ArgumentException(string.Format("Por favor, verifique el estado inicial y/o la tabla de transiciones. No se encontró transición para el estado {0} leyendo el caracter {1}.", estadoActual, cabezal.Leer())); } if (!TablaTransiciones.Any(x => x.Estado.Contains("accept")) && !TablaTransiciones.Any(x => x.EstadoSiguiente.Contains("accept"))) { throw new ArgumentException(string.Format("Por favor, verifique la tabla de transiciones. No se encontro ningún estado 'accept'.", estadoActual, cabezal.Leer())); } EstadoActual = estadoActual; Cabezal = cabezal; IntervaloDeTiempo = intervaloDeTiempo; Estado = Estado.Pausada; IndiceEnLaTabla = transicionInicial.RowIndex; IndiceEnLaTablaAnterior = IndiceEnLaTabla; Pasos = 0; } catch (ArgumentException) { throw; } catch (Exception) { throw; } }