let main () =
  try
    let _ = print_string "Linking...\n"; flush stdout; in
    let n_files = 
      if Array.length Sys.argv >= 5 then 2 else 1
    in
    let filename_list = 
      if n_files = 2 then
        [Sys.argv.(1); Sys.argv.(3)]
      else 
        [Sys.argv.(1)]
    in
    let outfile_names = 
      if n_files = 2 then
        [Sys.argv.(2); Sys.argv.(4)]
      else
        [Sys.argv.(2)]
    in
    let file_list = List.map open_in filename_list in
    let lexing_list = List.map Lexing.from_channel file_list in
      
      (** Parse files *)

    let linkst_list = List.map (Bmdlinkparse.link Bmdlinklex.bmd_link) lexing_list in
      
      (** Extract code *)

    let code_list = List.map extract_code linkst_list in
      
      (** Check for consistency *)

    let defs = List.flatten (vm_defs::linkst_list) in
    let _ = check_consistent defs in
      
      (** Output code *)

    let outfile_list = List.map open_out outfile_names in
    let _ = List.map2 output_string outfile_list code_list in
    let _ = print_string "Done.\n"; flush stdout; in
      ()
  with
      Parsing.Parse_error ->
        begin
          print_string "Syntax error on line ";
          print_string (string_of_int !Bmdlinklex.line_count);
          print_string ".\n";
          flush stdout;
        end
    | Sys_error s ->
        begin
          print_string "Could not open input file ";
          print_string s;
          print_string "\n";
          flush stdout;
        end
    | Linker_error s ->
        begin
          print_string s;
          print_string "\n";
          flush stdout;
        end
    | _ ->
        begin
          print_string "Linking failed.\n";
        end