Esempio n. 1
0
 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;
 }