Exemplo n.º 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 */
Exemplo n.º 2
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;

}
Exemplo n.º 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.
 */
    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;  
  
}
Exemplo n.º 4
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 */