function kleene() { // Extrae un elemento del arreglo de operandos if (empty($this->operandos)) { return false; } $A = array_pop($this->operandos); // Crea 2 nuevos estados q0 y q1 $q0 = new Estado($this->siguiente_ID++); $q1 = new Estado($this->siguiente_ID++); // Desde q0 crea una transición vacia a q1 $q0->setTransicion('ε', $q1); // Desde q0 crea una transicion vacia al estado inicial de $A $q0->setTransicion('ε', $A->getEstado(0)); // Crea una transicion vacía desde el estado final de $A a q1 $A->getEstado($A->getTotalEstados() - 1)->setTransicion('ε', $q1); // Crea una transición vacía desde el estado final de $A al estado inicial de $A $A->getEstado($A->getTotalEstados() - 1)->setTransicion('ε', $A->getEstado(0)); // Se agrega en $A el estado q0 al inicio $A->setEstadoInicio($q0); // Se agrega en $A el estado q1 al final $A->setEstado($q1); if (!in_array('ε', $A->getSimbolos())) { $A->setSimbolo('ε'); } // Se guarda el resultado $A en el stack de operandos $this->operandos[] = $A; return true; }