@Override
    public void caseAPrograma(APrograma node)
    {
        inAPrograma(node);
        if(node.getFimPrograma() != null)
        {
            node.getFimPrograma().apply(this);
        }
        {
            List<PComando> copy = new ArrayList<PComando>(node.getComando());
            Collections.reverse(copy);
            for(PComando e : copy)
            {
                e.apply(this);
            }
        }
        {
            List<PDeclaracao> copy = new ArrayList<PDeclaracao>(node.getDeclaracao());
            Collections.reverse(copy);
            for(PDeclaracao e : copy)
            {
                e.apply(this);
            }
        }
        if(node.getInicioPrograma() != null)
        {
            node.getInicioPrograma().apply(this);
        }
        if(node.getId() != null)
        {
            node.getId().apply(this);
        }
        if(node.getComecaPrograma() != null)
        {
            node.getComecaPrograma().apply(this);
        }
        outAPrograma(node);
    }