let print_program (p: program) (out: out_channel) = match p with
        Program(dlist,plist,c) ->  output_string out
                                    ("Program(\n\t" ^ (print_string_list (List.map print_dec dlist)) ^ "\n" ^ 
                                                    (print_string_list (List.map print_proc plist)) ^ "\n" ^ 
                                                    (print_cmd c) ^ "\n)")
      | SynError                ->  output_string out "SynError"