@Override
    public Void visitar(NoRetorne no) throws ExcecaoVisitaASA {
      NoExpressao expressao = no.getExpressao();
      if (expressao != null) {
        saida.append("return ");
        if (no.temPai()) {

          if (no.getPai() instanceof NoDeclaracaoFuncao) {
            TipoDado tipoRetornoFuncao = ((NoDeclaracaoFuncao) no.getPai()).getTipoDado();
            if (expressao.getTipoResultante() == TipoDado.REAL
                && tipoRetornoFuncao == TipoDado.INTEIRO) {
              saida.append("(int)");
            }
          }
        } else {
          throw new IllegalStateException("retorne não tem pai!");
        }

        expressao.aceitar(this);
      } else {
        saida.append("return");
      }

      return null;
    }
  public ErroPassagemParametroInvalida(
      NoExpressao valor, String nomeParametro, String nomeFuncao, int posicaoParametro) {
    super(valor.getTrechoCodigoFonte(), "ErroSemantico.ErroPassagemParametroInvalida");

    this.valor = valor;
    this.nomeParametro = nomeParametro;
    this.nomeFuncao = nomeFuncao;
    this.posicaoParametro = posicaoParametro;
  }
    private void inicializaVariaveisGlobaisNaoPassadasPorReferencia(
        List<NoDeclaracaoInicializavel> variaveisGlobais) throws ExcecaoVisitaASA {
      for (NoDeclaracaoInicializavel variavel : variaveisGlobais) {
        if (variavel instanceof NoDeclaracaoVariavel) {
          if (((NoDeclaracaoVariavel) variavel).ehPassadaPorReferencia()) {
            continue; // variáveis globais que são passadas como referência não são declaradas como
            // atributo no código Java
          }
        }

        boolean ehVetor = variavel instanceof NoDeclaracaoVetor;
        boolean ehMatriz = variavel instanceof NoDeclaracaoMatriz;
        boolean variavelInicializada = variavel.temInicializacao();

        if (ehVetor || ehMatriz || variavelInicializada) {
          saida.append(Utils.geraIdentacao(nivelEscopo + 1));
          saida.format("%s = ", variavel.getNome());
          if (variavelInicializada) {
            variavel.getInicializacao().aceitar(this);
          } else // vetores e matrizes não inicializados precisam ser instanciados
          {
            if (ehVetor) {
              NoExpressao tamanho = ((NoDeclaracaoVetor) variavel).getTamanho();
              if (tamanho != null) {
                String nomeTipo = Utils.getNomeTipoJava(variavel.getTipoDado());
                saida.format("new %s[", nomeTipo);
                tamanho.aceitar(this);
                saida.append("]");
              }
            } else // é uma matriz
            {
              NoExpressao linhas = ((NoDeclaracaoMatriz) variavel).getNumeroLinhas();
              NoExpressao colunas = ((NoDeclaracaoMatriz) variavel).getNumeroColunas();
              if (linhas != null && colunas != null) {
                String nomeTipo = Utils.getNomeTipoJava(variavel.getTipoDado());
                saida.format("new %s[", nomeTipo);
                linhas.aceitar(this);
                saida.append("][");
                colunas.aceitar(this);
                saida.append("]");
              }
            }
          }
          saida.append(";").println();
        }
      }
    }