示例#1
0
/* Pela definicao:
   e = t1 (+) t2 (+) t3 ... (+) tn
   sendo t algum Termo
 */
Erro Expressao() {
/* Processa uma expressão da cadeia de entrada.  */
    char operador = in[indIn];
    char unario = 0;

    VerificaCaractere();

    /*Operador Unario*/
    if(operador == '-'){
        unario = '~';
        avancaCaractere();
    }else if(operador == '+'){
        unario = '&';
        avancaCaractere();
    }

    Termo();

    if(unario){
        imprimeSaida(unario);
    }

    operador = in[indIn];
    while((operador == '+') || (operador == '-')){
        avancaCaractere();
        Termo();
        imprimeSaida(operador);
        operador = in[indIn];
    }
  
  return resCorreto;

} /* Expressao */
示例#2
0
文件: analisador.c 项目: gbsf/mc202
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 */