void main (void) { int cielo [FILA] [COLU]; char plano [FILA] [COLU]; int filas, columnas; int indice1, indice2; introduce_array (cielo, &filas, &columnas); for (indice1=0; indice1<filas; indice1++) for (indice2=0; indice2<columnas; indice2++) { if (indice1==0 || indice1==filas-1 || indice2==0 || indice2==columnas-1) plano [indice1] [indice2]=' '; if (indice1!=0 && indice1!=filas-1 && indice2!=0 && indice2!=columnas-1) { if (estrella (cielo , indice1, indice2)/9>6.0) plano [indice1] [indice2]='*'; else plano [indice1] [indice2]='.'; } } for (indice1=0; indice1<filas; indice1++) { printf ("\n"); for (indice2=0; indice2<columnas; indice2++) printf (" %c",plano [indice1] [indice2]); } }
parVectorMap parser::parsear(ifstream* fich, bool verbose) { // Inicialización de variables implicadas errores = 0; countLine = 0; estado = 0; etiquetasCompletamenteDefinidas = 0; etiquetasPendientes = 0; traducirEtiqueta("string para ocupar la posición 0, no tiene utilidad"); bool comentario = false; // Inicialización de las expresiones regulares implicadas regex coments("(;)(.*)"); regex igual("^(.*)(=)(.*)$"); regex estrella("^(.*)(\\*)(.*)$"); regex tag("^(.*)(:)$"); regex salto("^[jJ](.*)"); regex digito("^(.*)[[:digit:]]+"); regex halt("(halt)|(HALT)"); // Declaración de variables auxiliares string buff; string linea; instruccionTemp tmpIns; std::vector<char> v; while (getline(*fich, linea)) { countLine++; istringstream flujo(linea); string token; tmpIns = instruccionTemp(); while (flujo >> token) { bool palabraReservada = false; if (verbose) { cout << endl << token << "\t"; } if (regex_match(token, coments)) { // si encontramos ';' saltar a la siguiente línea if (verbose) { cout << "Comentario, saltando línea"; } comentario = true; break; } else if (regex_match(token, halt)) { if (verbose) { cout << "Fin del programa"; } tmpIns.opcode = HALT; } else { if (regex_match(token, igual) || regex_match(token, estrella)) { if (estado == 1 || estado == 5) { if (estado == 1) tmpIns.opcode = traducirOpcode(buff); // Lo siguiente será un número if (token[0] == '=') { if (tmpIns.opcode != 1 && tmpIns.opcode != 2) { tmpIns.especial = IGUAL; } else { cout << "[!] Error, la codificación '=' es inválida para las " "instrucciones READ Y STORE\n"; break; } } else { tmpIns.especial = ESTRELLA; } if (verbose) { cout << "Instrucción compleja '" << token[0] << "' "; } token = token.substr(1); palabraReservada = true; estado = 4; } else { errorOut(token); } } if (regex_match(token, digito)) { if (estado == 1) { // Fin de instrucción simple tmpIns.operando = atoi(token.c_str()); if (verbose) { cout << "Instrucción simple, '" << buff << "' fue el opcode " << traducirOpcode(buff) << endl; } tmpIns.opcode = traducirOpcode(buff); estado = 0; palabraReservada = true; } else if (estado == 5 || estado == 4) { // Fin de instrucción compuesta tmpIns.operando = atoi(token.c_str()); if (verbose) { cout << " de valor " << atoi(token.c_str()) << ", '" << buff << "' fue el opcode " << traducirOpcode(buff) << endl; } tmpIns.opcode = traducirOpcode(buff); estado = 0; palabraReservada = true; } else { errorOut(token); } } if (regex_match(token, tag)) { if (estado == 1) { // Lo siguiente será el descriptor de etiqueta etiqueta_indice.insert(pair<short, int>( traducirEtiqueta(buff), (vectorInstrucciones.size()))); if (verbose) { cout << "Ahora espero un opcode, '" << buff << "' era la etiqueta de entrada " << traducirEtiqueta(buff); } estado = 3; palabraReservada = true; } else if (estado == 0) { // lo siguiente será un opcode string aux = token.substr(0, token.size() - 1); etiqueta_indice.insert(pair<short, int>( traducirEtiqueta(aux), (vectorInstrucciones.size()))); if (verbose) { cout << "Ahora espero un opcode, '" << aux << "' es la etiqueta de entrada " << traducirEtiqueta(buff); } estado = 3; palabraReservada = true; } else { errorOut(token); } } if (regex_match(token, salto)) { if (estado == 1 || estado == 3 || estado == 0) { // Lo siguiente será el descriptor de etiqueta tmpIns.opcode = traducirOpcode(token); etiquetasPendientes++; if (verbose) { cout << "Esto es un salto, ahora espero una etiqueta a la que " "saltar"; } estado = 2; palabraReservada = true; } else { errorOut(token); } } if (!palabraReservada) { if (estado == 0) { // cargamos en el buffer el token en espera de averiguar si es una // instrucción o una etiqueta if (verbose) { cout << "Guardado en buffer"; } estado = 1; buff = token; } else if (estado == 3) { // lo obtenido es el opcode de la instrucción if (verbose) { cout << "Este es el opcode " << traducirOpcode(token); } tmpIns.opcode = traducirOpcode(token); estado = 5; buff = token; } else if (estado == 2) { // lo obtenido es la etiqueta a la que se salta tmpIns.tagSalida = traducirEtiqueta(token); if (verbose) { cout << "Esta es la etiqueta de salida " << tmpIns.tagSalida << endl; } estado = 0; } else { errorOut(token); } } } } // construir instrucción if (tmpIns.opcode > -1) //! comentario vectorInstrucciones.push_back(crearInstruccion(tmpIns)); comentario = false; } parVectorMap resultado; if (etiquetasCompletamenteDefinidas < etiquetasPendientes) { cout << "[!] Error, existen saltos a etiquetas sin definir" << endl; errores++; } cout << endl << endl; if (errores == 0) resultado = {etiqueta_indice, vectorInstrucciones}; else resultado = {etiqueta_indice, vector<instruccion*>(0)}; return resultado; }