#include<vector>
#include<string>
#include<set>
#include<stack>
struct trans {
int camino_desde;
int camino_hasta;
char transicion_simbolo;
};
class NFA {
public:
vector<int> camino;
vector<trans> transiciones;
int estado_final;
NFA() {
int contar_camino() {
return camino.size();
}
camino.push_back(i);
trans nueva_transicion;
nueva_transicion.camino_desde = camino_desde;
nueva_transicion.camino_hasta = camino_hasta;
nueva_transicion.transicion_simbolo = transicion_simbolo;
transiciones.push_back(nueva_transicion);
estado_final = fs;
int estado_final() {
return estado_final;
void mostrar() {
trans nueva_transicion;
cout<<"\n";
nueva_transicion = transiciones.at(i);
cout<<"q"<<nueva_transicion.camino_desde<<" -->
q"<<nueva_transicion.camino_hasta<<" : Symbol -
"<<nueva_transicion.transicion_simbolo<<endl;
};
NFA resultado;
resultado.camino(a.contar_camino() + b.contar_camino());
int i;
trans nueva_transicion;
nueva_transicion = a.transiciones.at(i);
resultado.asig_camino(nueva_transicion.camino_desde,
nueva_transicion.camino_hasta, nueva_transicion.transicion_simbolo);
nueva_transicion = b.transiciones.at(i);
resultado.asig_camino(nueva_transicion.camino_desde + a.contar_camino(),
nueva_transicion.camino_hasta + a.contar_camino(), nueva_transicion.transicion_simbolo);
}
return resultado;
NFA kleene(NFA a) {
NFA resultado;
int i;
trans nueva_transicion;
resultado.camino(a.contar_camino() + 2);
resultado.asig_camino(0, 1, '^');
nueva_transicion = a.transiciones.at(i);
resultado.asig_camino(nueva_transicion.camino_desde + 1,
nueva_transicion.camino_hasta + 1, nueva_transicion.transicion_simbolo);
resultado.asig_camino(a.contar_camino(), 1, '^');
resultado.estado_final(a.contar_camino() + 1);
return resultado;
}
NFA seleccion(vector<NFA> selecciones, int num_selecciones) {
NFA resultado;
int camino_count = 2;
int i, j;
NFA med;
trans nueva_transicion;
camino_count += selecciones.at(i).contar_camino();
resultado.camino(camino_count);
int adder_track = 1;
med = selecciones.at(i);
nueva_transicion = med.transiciones.at(j);
resultado.asig_camino(nueva_transicion.camino_desde + adder_track,
nueva_transicion.camino_hasta + adder_track, nueva_transicion.transicion_simbolo);
adder_track += med.contar_camino();
}
resultado.estado_final(camino_count - 1);
return resultado;
stack<char> operators;
stack<NFA> operands;
char op_sym;
int op_count;
char cur_sym;
NFA *new_sym;