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]);
	}

}
Beispiel #2
0
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;
}