public void gera(
      ASAPrograma asa,
      PrintWriter saida,
      String nomeClasseJava,
      boolean geraCodigoParaInterrupcaoDeThread,
      boolean geraCodigoParaPontosDeParada,
      boolean geraCodigoParaInspecaoDeSimbolos)
      throws ExcecaoVisitaASA, IOException {

    PreCompilador preCompilador = new PreCompilador();
    asa.aceitar(preCompilador);

    VisitorGeracaoCodigo gerador =
        new VisitorGeracaoCodigo(
            asa,
            saida,
            geraCodigoParaInterrupcaoDeThread,
            geraCodigoParaPontosDeParada,
            geraCodigoParaInspecaoDeSimbolos);

    int totalVariaveis = asa.getTotalVariaveisDeclaradas();
    int totalVetores = asa.getTotalVetoresDeclarados();
    int totalMatrizes = asa.getTotalMatrizesDeclaradas();

    gerador
        .geraPackage("programas")
        .pulaLinha()
        .geraImportacaoPara(ErroExecucao.class)
        .geraImportacaoPara(Programa.class)
        .geraImportacaoDasBibliotecasIncluidas()
        .pulaLinha()
        .geraNomeDaClasse(nomeClasseJava)
        .geraChaveDeAberturaDaClasse()
        .pulaLinha()
        .geraAtributosParaAsBibliotecasIncluidas()
        .pulaLinha()
        .geraAtributosParaAsVariaveisGlobais()
        .pulaLinha()
        .geraAtributosParaAsVariaveisPassadasPorReferencia(
            preCompilador.getVariaveisPassadasPorReferencia())
        .pulaLinha()
        .geraConstrutor(nomeClasseJava, totalVariaveis, totalVetores, totalMatrizes)
        .pulaLinha()
        .geraInicializacaoVariaveisGlobais()
        .pulaLinha()
        .geraMetodos(preCompilador.getFuncoesQuerForamInvocadas())
        .geraChaveDeFechamentoDaClasse();
  }
 public GeradorCodigoJava() {
   this.seed = PreCompilador.getSeedGeracaoNomesValidos();
 }