-
Notifications
You must be signed in to change notification settings - Fork 0
/
AFD.cpp
123 lines (104 loc) · 3.58 KB
/
AFD.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "AFD.h"
AFD::AFD(unsigned int cantEstados, unsigned int tamAlfabeto) : Automata(cantEstados, tamAlfabeto) {
this->f = new Estado **[cantEstados];
for (int i = 0; i < cantEstados; ++i) {
f[i] = new Estado *[tamAlfabeto];
for (int j = 0; j < tamAlfabeto; ++j)
f[i][j] = nullptr;
}
//primer paramtro representa filas (estados)
//segundo paramtetro representa columnas (entradas)
}
void AFD::setF(std::string nombreEstadoSalida, char entrada, std::string nombreEstadoDestino) {
unsigned int ESalida, EDestino, entIndex;
if (tieneFDeterminada)
throw -23; // la funcion de transicion ya fue definida
try {
ESalida = this->getEstadoIndex(nombreEstadoSalida);
} catch (int exc) {
if (-1 == exc)
throw -11;
}
try {
EDestino = this->getEstadoIndex(nombreEstadoDestino);
} catch (int exc) {
if (-1 == exc)
throw -12;
}
try {
entIndex = this->getAlfabetoIndex(entrada);
} catch (int exc) {
if (-1 == exc)
throw -13;
}
if (nullptr != this->f[ESalida][entIndex])
throw -14;
this->f[ESalida][entIndex] = new Estado();
this->f[ESalida][entIndex]->nombre = this->estados[EDestino].nombre;
this->f[ESalida][entIndex]->situacion = this->estados[EDestino].situacion;
this->tieneFDeterminada = this->isReadyF();
}
void AFD::transicion() {
if (!this->automataListo || this->automataApagado) // o automata apagado
throw -8;
if (this->cadenaAnalizar[1] == '\0') {
this->automataApagado = true;
}
char entrada = this->cadenaAnalizar[0];
this->cadenaAnalizar = &this->cadenaAnalizar[1];
estadoActual = this->f[this->getEstadoIndex(estadoActual->nombre)][this->getAlfabetoIndex(entrada)];
// no puede dar error porque entrada ya fue verificada en setCadenaAnalizar
}
bool AFD::isReadyF() {
for (int i = 0; i < this->nroEstados; ++i)
for (int j = 0; j < this->nroElementosAlfabeto; ++j)
if (nullptr == f[i][j])
return false;
this->tieneFDeterminada = true;
this->setAutomataListo();
return true;
}
void AFD::setAutomataListo() {
this->automataListo = this->tieneEstadoInicial &&
this->tieneEstadoSalida &&
this->tieneEstadosDefinidos &&
this->tieneEntradasDefinidas &&
this->tieneFDeterminada &&
this->tieneCadenaAnalizar;
}
std::string AFD::tipoAutomata() {
return "AFD";
}
std::string AFD::expresionEspecifica() {
return "";
}
void AFD::reiniciarAutomata() {
this->automataListo = false;
this->automataApagado = false;
this->cadenaAnalizar = "";
this->tieneCadenaAnalizar = false;
this->estadoActual = this->estadoInicial;
}
AFD::AFD(const AFD &x) : Automata(x) {
this->f = new Estado **[this->nroEstados];
for (int i = 0; i < this->nroEstados; ++i) {
this->f[i] = new Estado *[this->nroElementosAlfabeto];
for (int j = 0; j < this->nroElementosAlfabeto; ++j) {
if (nullptr == x.f[i][j])
this->f[i][j] = nullptr;
else {
this->f[i][j] = new Estado;
this->f[i][j]->nombre = x.f[i][j]->nombre;
this->f[i][j]->situacion = x.f[i][j]->situacion;
}
}
}
}
AFD::~AFD() {
for (int i = 0; i < this->nroEstados; ++i) {
for (int j = 0; j < this->nroElementosAlfabeto; ++j)
delete f[i][j];
delete this->f[i];
}
delete f;
}