示例#1
0
文件: paso.cpp 项目: ad1cted/UTEM
int main()
{
    int i, n, c, s, a;
    
    printf("Ingrese n:\n");
    scanf("%d",&n);
    c = contar(n);
    printf("Cantidad de digitos es %d\n",c);
    
    printf("ingrese dijito:\n");
    scanf("%d", &n);
    i = digito(n);   
    printf("Cantidad dijitos en forma xD es %d\n", i);
    
    system("pause");
}
示例#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;
}