Пример #1
0
Erro Primario() {
/* Processa um fator primário da cadeia de entrada.  */

  Erro err = resCorreto;
  char letra;

  /* Remover os espaços do início */
  while (isspace(in[indIn]))
    indIn++;

  /* Se for parêntese, iniciar expressão aninhada */
  if (in[indIn] == '(') {
    indIn++;
    err = Expressao();
    if (err.codigoErro != EXPR_VALIDA)
      return err;
    if (in[indIn] == ')')
      indIn++;
    else
      return montaErro(FECHA_PARENTESE_ESPERADO, indIn);
  } else {
    letra = in[indIn];
    /* Verificar se é um operando válido */
    if (isalpha(letra))
      pos[indPos++] = letra;
    else
      return montaErro(CARACTERE_INVALIDO, indIn);
    indIn++;
  }

  return resCorreto;

} /* Primario */
Пример #2
0
/*Verifica se o caractere de entrada é valido, se nao for modifica 'geral'*/
void VerificaCaractere(){
    char car = in[indIn];

    if ((car >= 'a' && car <= 'z') || car == '+' || car == '-' || car == '*' || car == '/' ||
        car == '^' || car == '(' || car == ')' || car == '\0') {
        return;
    }else{
        geral = montaErro(CARACTERE_INVALIDO, indIn);
    }
}/*Verifica Caractere*/
Пример #3
0
Erro InPos(char *infixa, char *posfixa) {
/* Transforma uma expressão da notação infixa para a pós-fixa. Em caso
   de erro, devolve o código e a posição na cadeia de entrada onde o
   erro foi encontrado.  */

  Erro err = resCorreto;
  char c;

  in = infixa;
  indIn = 0;
  pos = posfixa;
  indPos = 0;

  /* Remover os espaços do início */
  while (isspace(in[indIn]))
    indIn++;

  /* Se não há nada na entrada, marcar erro */
  if (in[indIn] == '\0')
    err = montaErro(CADEIA_DE_BRANCOS, 0);
  /* Senão, computar a expressão */
  else
    err = Expressao();

  /* Se a entrada não acabou, marcar erro */
  if (in[indIn] != '\0' && err.codigoErro == EXPR_VALIDA)
    err = montaErro(OPERADOR_ESPERADO, indIn);

  /* Verificar se o caracter que causou o erro é inválido */
  if (err.codigoErro != EXPR_VALIDA) {
    c = in[indIn];
    if (!isalpha(c) && !isspace(c) &&
        c != '+' && c != '-' && c != '*' && c != '/' &&
        c != '(' && c != ')' && c != '^' && c != '\0')
      err = montaErro(CARACTERE_INVALIDO, indIn);
  }

  posfixa[indPos] = '\0';
  return err;

}
Пример #4
0
Erro InPos(char *infixa, char *posfixa) {
/* Transforma uma expressão da notação infixa para a pós-fixa. Em caso
   de erro, devolve o código e a posição na cadeia de entrada onde o
   erro foi encontrado.
 */
    in = &infixa[0];
    pos = &posfixa[0];
    indPos = indIn = 0;

    /* Zera a variavel global de erro */
    geral.posicao = -1;

    /* Caso a programa comece com um espaco, pula ate o caractere valido mais proximo */
    while(in[indIn] == ' '){
        indIn++;
    }
    /* Caso pule todos os espacos e termine, a entrada eh branca */
    if (in[indIn] == '\0'){
        return montaErro(CADEIA_DE_BRANCOS, 0);
    }

    Expressao();

    /* Termina de montar a string da posfixa */
    pos[indPos] = '\0';

    /* Se terminou de ler o programa e ainda possui algum caractere na entrada */
    if(in[indIn] != '\0'){
        geral = montaErro(OPERADOR_ESPERADO, indIn);
    }

    /* Caso o programa tenha apresentado algum erro */
    if (geral.posicao != -1) {
        return geral;
    }

    return resCorreto;  
  
}
Пример #5
0
/*A funcao primaria possui duas possibilidades :
  p = x ou p = (e), ou seja, uma expressao entre
  parenteses ou uma variável
*/
Erro Primario() {
/* Processa um fator primário da cadeia de entrada.  */
    char corrente = in[indIn];
    
    switch(corrente){
        /* Caso seja um parenteses, tera uma expressao dentro dele */
        case '(':
            avancaCaractere();

            Expressao();

            /* Verifica o fechamento do parenteses */
            if(in[indIn] == ')'){
                avancaCaractere();
            }else{
                geral = montaErro(FECHA_PARENTESE_ESPERADO, indIn);
            }
            break;
        /* Caso seja um operador nao esperado */
        case ')':
        case '/':
        case '*':
        case '+':
        case '-':
        case '\0':
            geral = montaErro(OPERANDO_ESPERADO, indIn);
            break;
        /* Caso seja uma variavel(a, b, c, ... ,z) */
        default:
            imprimeSaida(in[indIn]);
            avancaCaractere();
            break;
    }
  
  return resCorreto;
} /* Primario */
Пример #6
0
Erro Termo() {
/* Processa um termo da cadeia de entrada.  */

  Erro err = resCorreto;
  char op;

  /* Remover os espaços do início */
  while (isspace(in[indIn]))
    indIn++;

  /* Fim da entrada */
  if (in[indIn] == '\0' || in[indIn] == ')')
    return montaErro(OPERANDO_ESPERADO, indIn);

  err = Fator();
  if (err.codigoErro != EXPR_VALIDA)
    return err;

  do {  
    /* Remover os espaços até o próximo caracter */
    while (isspace(in[indIn]))
      indIn++;

    op = in[indIn];

    if (op == '*' || op == '/') {
      /* Consumir o operador */
      indIn++;

      err = Fator();
      if (err.codigoErro != EXPR_VALIDA)
        return err;
      pos[indPos++] = op;
    } else
      break;
  } while (true);

  return resCorreto; 

} /* Termo */
Пример #7
0
Erro Expressao() {
/* Processa uma expressão da cadeia de entrada.  */

  Erro err = resCorreto;
  char op;

  /* Remover os espaços do início */
  while (isspace(in[indIn]))
    indIn++;

  /* Fim da entrada */
  if (in[indIn] == '\0' && in[indIn] == ')')
    return montaErro(OPERANDO_ESPERADO, indIn);

  /* Tratar mais e menos unário aqui, pois eles só podem aparecer
   * no primeiro elemento de uma expressão */
  if (in[indIn] == '-') {
    indIn++;
    err = Termo();
    if (err.codigoErro != EXPR_VALIDA) {
      /* O erro parentético tem precedência */
      if (err.codigoErro == FECHA_PARENTESE_ESPERADO)
        return err;
      return montaErro(OPERANDO_ESPERADO, indIn);
    }
    pos[indPos++] = '~';
  } else if (in[indIn] == '+') {
    indIn++;
    err = Termo();
    if (err.codigoErro != EXPR_VALIDA) {
      /* O erro parentético tem precedência */
      if (err.codigoErro == FECHA_PARENTESE_ESPERADO)
        return err;
      return montaErro(OPERANDO_ESPERADO, indIn);
    }
    pos[indPos++] = '&';
  } else {
    err = Termo();
    if (err.codigoErro != EXPR_VALIDA) {
      /* O erro parentético tem precedência */
      if (err.codigoErro == FECHA_PARENTESE_ESPERADO)
        return err;
      return montaErro(OPERANDO_ESPERADO, indIn);
    }
  }

  do {
    /* Remover os espaços até o próximo caracter */
    while (isspace(in[indIn]))
      indIn++;
    
    op = in[indIn];

    if (op == '+' || op == '-') {
      /* Consumir o operador */
      indIn++;

      err = Termo();
      if (err.codigoErro != EXPR_VALIDA) {
        /* O erro parentético tem precedência */
        if (err.codigoErro == FECHA_PARENTESE_ESPERADO)
          return err;
        return montaErro(OPERANDO_ESPERADO, indIn);
      }
      pos[indPos++] = op;
    } else
      break;
  } while (true);

  return resCorreto;

} /* Expressao */