-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
265 lines (204 loc) · 9.85 KB
/
main.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
//Se compila: g++ -ggdb -o main main.cpp -L Clase.h
// -Wtrigraphs -Wwrite-strings
//Para ver todos los avisos -Wall
//#include <sys/types.h>
#include <regex.h>
#include <vector>
#include <cctype>
#include "OA.h"
#include <new>
using std::set_new_handler;
#include <cstdlib>
using std::abort;
void mensaje_error(){
cerr << "Error de memoria, bad_alloc";
abort();
}
//Funcion que recibe un string, y elimina los espacios en blanco del mismo
string Trim(string cadena)
{
string::const_iterator i = cadena.begin();
string::const_iterator f = cadena.end();
string::const_iterator it;
string buff;
for (it = i; it != f; ++it)
{
if (*it != ' ') buff += *it;
}
return buff;
}
string StringToUpper(string myString)
{
const int length = myString.length();
for(int i=0; i!=length ; ++i)
{
myString[i] = toupper(myString[i]);
}
return myString;
}
int main(){
set_new_handler( mensaje_error ); //Llama al metodo cuando hay una sobrecarga de memoria, mensaje personalizado
typedef int T;
int i, j, n, cont;
string c, in, h1, h2;
Clase *x;
Instancia *is;
string buffer;
OA *oa_bd = new OA();
cout << "oa_bd->crear_clase( huracan )" << endl;
cout << oa_bd->crear_clase( "huracan" ) << endl<< endl;
cout << "oa_bd->crear_clase( fenMeteorologico )" << endl;
cout << oa_bd->crear_clase( "fenMeteorologico" )<< endl<< endl;
cout << "oa_bd->crear_clase( fenClimatico )" << endl;
cout << oa_bd->crear_clase( "fenClimatico" )<< endl<< endl;
cout << "oa_bd->crear_propiedad(fenClimatico, NumMuertos, ENTERO)" << endl;
cout << oa_bd->crear_propiedad("fenClimatico", "NumMuertos", ENTERO)<< endl<< endl;
cout << "oa_bd->crear_propiedad(fenClimatico, HuboPerdidaHumana, CADENA)" << endl;
cout << oa_bd->crear_propiedad("fenClimatico", "HuboPerdidaHumana", CADENA)<< endl<< endl;
cout << "oa_bd->crear_propiedad(huracan, intensidad, ENTERO)" << endl;
cout << oa_bd->crear_propiedad( "huracan", "intensidad", ENTERO )<< endl<< endl;
cout << "oa_bd->crear_propiedad(huracan, categoria, ENTERO)" << endl;
cout << oa_bd->crear_propiedad( "huracan", "categoria", ENTERO )<< endl<< endl; //Propiedad Padre
cout << "oa_bd->agregar_subpropiedad(intensidad, categoria)" << endl;
cout << oa_bd->agregar_subpropiedad("intensidad", "categoria") << endl<< endl;
cout << "oa_bd->agregar_subclase(huracan, fenMeteorologico)" << endl;
cout << oa_bd->agregar_subclase("huracan", "fenMeteorologico") << endl<< endl;
cout << "oa_bd->agregar_subclase(huracan, fenClimatico)" << endl;
cout << oa_bd->agregar_subclase("huracan", "fenClimatico") << endl<< endl;
cout << "oa_bd->crear_instancia( ike, huracan )" << endl;
cout << oa_bd->crear_instancia( "ike", "huracan" ) << endl<< endl;
cout << "oa_bd->crear_instancia( desastreVargas, fenClimatico )" << endl;
cout << oa_bd->crear_instancia( "desastreVargas", "fenClimatico" ) << endl<< endl;
cout << "oa_bd->crear_evento(fenClimatico, HuboMuerte, HuboPerdidaHumana, Si,NumMuertos > 0)" << endl;
cout << oa_bd->crear_evento("fenClimatico", "HuboMuerte", "HuboPerdidaHumana", "Si","NumMuertos > 0") << endl<< endl;
cout << "oa_bd->consultar_propiedad_instancia(huracan, ike, NumMuertos)" << endl;
cout << oa_bd->consultar_propiedad_instancia("huracan", "ike", "NumMuertos") << endl<< endl;
cout << "oa_bd->consultar_propiedad_instancia(huracan, ike, HuboPerdidaHumana)" << endl;
cout << oa_bd->consultar_propiedad_instancia("huracan", "ike", "HuboPerdidaHumana") << endl<< endl;
cout << "oa_bd->consultar_propiedad_instancia(huracan, ike, intensidad)" << endl;
cout << oa_bd->consultar_propiedad_instancia("huracan", "ike", "intensidad") << endl<< endl;
cout << "oa_bd->consultar_propiedad_instancia(huracan, ike, categoria)" << endl;
cout << oa_bd->consultar_propiedad_instancia("huracan", "ike", "categoria") << endl<< endl;
cout << "oa_bd->agregar_valorApropiedad(huracan, ike, NumMuertos, 125)" << endl;
cout << oa_bd->agregar_valorApropiedad("huracan", "ike", "NumMuertos", 125)<< endl<< endl;
cout << "oa_bd->agregar_valorApropiedad(huracan, ike, categoria, 4)" << endl;
cout << oa_bd->agregar_valorApropiedad("huracan", "ike", "intensidad", 4)<< endl<< endl;
cout << "oa_bd->activar_eventos(huracan, HuboMuerte)" << endl;
cout << oa_bd->activar_eventos("huracan", "HuboMuerte") << endl;
cout << "oa_bd->consultar_propiedad_instancia(huracan, ike, NumMuertos)" << endl;
cout << oa_bd->consultar_propiedad_instancia("huracan", "ike", "NumMuertos") << endl<< endl;
cout << "oa_bd->consultar_propiedad_instancia(huracan, ike, HuboPerdidaHumana)" << endl;
cout << oa_bd->consultar_propiedad_instancia("huracan", "ike", "HuboPerdidaHumana") << endl<< endl;
cout << "oa_bd->consultar_propiedad_instancia(huracan, ike, intensidad)" << endl;
cout << oa_bd->consultar_propiedad_instancia("huracan", "ike", "intensidad") << endl<< endl;
cout << "oa_bd->consultar_propiedad_instancia(huracan, ike, categoria)" << endl;
cout << oa_bd->consultar_propiedad_instancia("huracan", "ike", "categoria") << endl<< endl;
cout << "oa_bd->es_subpropiedad_de(intensidad, categoria)" << endl;
cout << oa_bd->es_subpropiedad_de("intensidad", "categoria") << endl<< endl;
cout << "oa_bd->pertenece_a(ike, huracan)" << endl;
cout << oa_bd->pertenece_a("ike", "huracan") << endl<< endl;
cout << "oa_bd->pertenece_a(ike, fenNatural)" << endl;
cout << oa_bd->pertenece_a("ike", "fenNatural") << endl<< endl;
/** Se hace la lectura por archivos de las consultas reactivas:
* Se verifica la correctitud de la sintaxis
* No deben haber eventos repetidos
* Se comprueba la existencia de la clase donde se activara el o los eventos
*
*/
ifstream entrada("consultas_reactivas.in");
int reti;
regex_t regex; //Variable para la expresion regular
string exp;
char * pattern ="^\\((S|s|p|P),\\[([A-Za-z0-9])+(([,])([A-Za-z0-9])+)*\\],([A-Za-z0-9])+\\)$"; //Patron de la expresion regular
/**
^ Indica el inicio de la frase
\\( Agrega el parentesis
(S|s|p|P) debe haber cualquiera de las letras que esta entre parentesis
, Debe haber siempre una coma
\\[ Agrega el corchete
([A-Za-z0-9])+ 1 o mas palabras que contengan letras y numeros
(([,])([A-Za-z0-9])+)* expresion formada por una coma seguido y 1 palabra que contenga letras y numeros (Puede haber 0 o mas expresiones)
\\] Agrega corchete
, Debe haber siempre una coma
([A-Za-z0-9])+ 1 o mas palabras que contengas letras y numeros
\\) Agrega el parentesis
$ indica el final de la frase
*/
reti = regcomp (®ex, pattern, REG_EXTENDED);//Compilo el patrón
while( getline (entrada,exp) ){//Leo una linea del archivo
exp = Trim(exp);//Quitar espacios de la expresion
cout << exp << " " << endl;
reti = regexec (®ex, &exp[0], (size_t)0, NULL, 0); //Se verifica que la consulta reactiva cumpla con el patrón
if( reti == REG_NOMATCH ){ //Error de sintaxis en la consulta reactiva
puts("Error de sintaxis");
}
else{ //Si es 0, entonces la consulta reactiva cumple con el patrón
// Se obtienen los eventos dentro del corchete
int status;
regex_t re;
regmatch_t rm;
char *patter = "\\[([A-Za-z0-9])+(([,])([A-Za-z0-9])+)*\\]";
string eventos, tipo, tabla;
int num_eventos;
map<string,string> *eventosHash;//Tabla Hash con los eventos de la consulta-reactiva
string eventoArreglo[100];
string eve;
bool band;
eventosHash = new map<string, string>();
//Se compila la expresión regular y se verifica si tiene algún error
if (regcomp(&re, patter, REG_EXTENDED) != 0) {
cout << "Patrón erróneo";
}
status = regexec(&re, &exp[0], 1, &rm, 0); //Se verifica que el grupo de eventos de la consulta reactiva cumpla con el patrón
regfree(&re); //Libera la memoria asignada por regcomp()
if (status != 0) { //Si el estado no devuelve 0, entonces no cumple el patrón
cout << "No coincide";
cout << status << endl;
}
else{
// Extraigo el rango de los eventos
eventos = exp.substr( (int)rm.rm_so, (int)rm.rm_eo - 3);
tipo = exp.substr(1, (int)rm.rm_so - 2); //Tipo de ejecucion de ventos
tabla = exp.substr((int)rm.rm_eo + 1 , exp.size() ); //Clase donde se ejecutaran los eventos
tabla.erase(tabla.size() - 1 , 2);
eventos = eventos.substr( 1, eventos.size());
eventos[ eventos.size()-1 ] = ',';
}
cout << "Modo de activacion: "<< tipo<< ", Clase: " << tabla << endl;
// Se obtienen los nombres de los eventos y se verifica que no hayan repetidos
num_eventos = 0;
band = true;
if( StringToUpper( tipo ) == "P"){ //Se verifica si es paralelo para no permitir eventos repetidos
do{
int f;
f = eventos.find(","); //Busco la posicion de la coma mas cercana
eve = eventos.substr(0, f); //Extraigo un evento de la lista
if( (*eventosHash)[eve] != "" ){//Reviso si es evento es repetido
band = false;
}
else{
(*eventosHash)[eve] = eve; //Guardo el evento en la tabla hash
eventoArreglo[num_eventos] = eve;
num_eventos+=1; //Contador de eventos
eventos = eventos.substr( f+1, eventos.size()-1);//Elimino el evento que se agrego de la cadena original
}
}while( eventos.size() > 1 && band );
}
if(!band){
cout << "Hay uno o más eventos repetidos" << endl;
}
else{
//Verificar que existen los eventos y la clase en donde se activaran
if( oa_bd->existencia_consulta_reactiva(eventoArreglo, num_eventos, tabla) &&
oa_bd->organizar_eventos(eventoArreglo, num_eventos, tabla) ){
cout << "ACTIVA! " << endl;
//oa_fbd->activar_eventos(nom_evento, nom_);
}
}
}
cout << endl;
}
regfree (®ex);
entrada.close();
return EXIT_SUCCESS;
}