@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; }
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(); } } }