opam-repository icon indicating copy to clipboard operation
opam-repository copied to clipboard

Patch to make dypgen compile with latest versions of ocaml

Open mlemerre opened this issue 9 months ago • 6 comments

Hi,

Dypgen requires an old version of OCaml mainly because of the strings <-> bytes incompatibility. I made a quick patch that allows it to compile (attached).

But as it seems to be unmaintained, I am not sure where to send this patch to; I send it here because this is the Maintainer field for the opam package.

Is there a procedure in this kind of situation?

diff -u -r /tmp/dypgen/dypgen/dypgen.ml ./dypgen/dypgen.ml
--- /tmp/dypgen/dypgen/dypgen.ml	2011-11-25 21:37:13.000000000 +0100
+++ ./dypgen/dypgen.ml	2023-09-19 11:03:59.568726196 +0200
@@ -1620,12 +1620,12 @@
 
 
 
-let () = Insert_linenum.buffer := String.copy parser_code
+let () = Insert_linenum.buffer := Bytes.of_string parser_code
 let lexbuf = Lexing.from_string parser_code
 let parser_code = Insert_linenum.insert_linenum lexbuf
 
 let dest_file = open_out temp_output_file
-let () = output_string dest_file parser_code
+let () = output_bytes dest_file parser_code
 let () = close_out dest_file
 
 
@@ -1689,15 +1689,15 @@
     (List.fold_left aux "" non_terminal_start_list)^
     mli_code
   in
-  Insert_linenum.buffer := String.copy parser_code_mli;
+  Insert_linenum.buffer := Bytes.of_string parser_code_mli;
   let lexbuf = Lexing.from_string parser_code_mli in
   let parser_code_mli = Insert_linenum.insert_linenum lexbuf in
   let dest_file_mli = open_out output_file_mli in
-  output_string dest_file_mli parser_code_mli;
+  output_bytes dest_file_mli parser_code_mli;
   close_out dest_file_mli;
-  let lexbuf = Lexing.from_string parser_code in
+  let lexbuf = Lexing.from_string (Bytes.to_string parser_code) in
   (try Insert_linenum.replace_filename parser_code input_file_short lexbuf
   with Failure _ -> (error_regexp (input_file_short^".ml.temp"); exit 2));
   let dest_file = open_out output_file in
-  output_string dest_file parser_code;
+  output_bytes dest_file parser_code;
   close_out dest_file)
diff -u -r /tmp/dypgen/dypgen/dypgen_lexer.mll ./dypgen/dypgen_lexer.mll
--- /tmp/dypgen/dypgen/dypgen_lexer.mll	2010-06-24 22:57:53.000000000 +0200
+++ ./dypgen/dypgen_lexer.mll	2023-09-19 10:59:41.463143015 +0200
@@ -56,7 +56,7 @@
   | 'r' -> '\r'
   | c   -> c
 
-let string_of_char c = let x = " " in x.[0] <- c; x
+let string_of_char c = String.make 1 c
 
 }
 
diff -u -r /tmp/dypgen/dypgen/extract_type.mll ./dypgen/extract_type.mll
--- /tmp/dypgen/dypgen/extract_type.mll	2010-06-24 22:57:53.000000000 +0200
+++ ./dypgen/extract_type.mll	2023-09-19 10:58:21.106650076 +0200
@@ -121,10 +121,10 @@
     let len = String.length r in
     let s = String.sub r 1 (len-2) in
     if s = oldtp then
-      (let s = "'"^newtp^" " in
-      let len2 = String.length s in
+      (let s = Bytes.of_string ("'"^newtp^" ") in
+      let len2 = Bytes.length s in
       s.[len2-1] <- r.[len-1];
-      Buffer.add_string string_buf s)
+      Buffer.add_bytes string_buf s)
     else
       Buffer.add_string string_buf r;
     replace_tpar oldtp newtp lexbuf }
@@ -137,12 +137,14 @@
   | [^'_''['] * eof { () }
   | "_[" ['<''>']
     { let i = Lexing.lexeme_start lexbuf in
+      let fun_typ = Bytes.of_string fun_typ in
     fun_typ.[i] <- ' '; fun_typ.[i+2] <- ' ';
-    fix_variant fun_typ lexbuf}
+    fix_variant (Bytes.unsafe_to_string fun_typ) lexbuf}
   | "[" ['<''>']
     { let i = Lexing.lexeme_start lexbuf in
+      let fun_typ = Bytes.of_string fun_typ in
     fun_typ.[i+1] <- ' ';
-    fix_variant fun_typ lexbuf}
+    fix_variant (Bytes.unsafe_to_string fun_typ) lexbuf}
   | [^'_''['] + { fix_variant fun_typ lexbuf }
   | ['_''['] { fix_variant fun_typ lexbuf }
 
diff -u -r /tmp/dypgen/dypgen/insert_linenum.mll ./dypgen/insert_linenum.mll
--- /tmp/dypgen/dypgen/insert_linenum.mll	2010-06-24 22:57:53.000000000 +0200
+++ ./dypgen/insert_linenum.mll	2023-09-19 11:01:40.679874301 +0200
@@ -1,7 +1,7 @@
 {
 open Lexing
 
-let buffer = ref ""
+let buffer = ref (Bytes.empty)
 
 let update_loc lexbuf file line absolute chars =
   let pos = lexbuf.lex_curr_p in
@@ -24,12 +24,12 @@
       insert_linenum lexbuf }
   | "# insert-line-number"
       { let pos = Lexing.lexeme_start_p lexbuf in
-      let space = String.make 20 ' ' in
+      let space = Bytes.make 20 ' ' in
       let str = "# "^(string_of_int (pos.pos_lnum+1)) in
       String.blit str 0 space 0 (String.length str);
-      String.blit space 0 !buffer pos.pos_cnum 20;
+      String.blit (Bytes.unsafe_to_string space) 0 !buffer pos.pos_cnum 20;
       insert_linenum lexbuf }
-  | eof { let result = !buffer in buffer := ""; result }
+  | eof { let result = !buffer in buffer := Bytes.empty; result }
   | [^'#''\010''\013']+ { insert_linenum lexbuf }
   | _ { insert_linenum lexbuf }
 
diff -u -r /tmp/dypgen/dyplib/Makefile ./dyplib/Makefile
--- /tmp/dypgen/dyplib/Makefile	2011-11-25 15:26:27.000000000 +0100
+++ ./dyplib/Makefile	2023-09-19 10:54:33.853256015 +0200
@@ -4,7 +4,7 @@
 CAMLC=ocamlc
 OCAMLFIND=ocamlfind
 
-all: dyp opt prof
+all: dyp opt
 
 dyp: dyp.cmi priority_by_relation.cmo automaton.cmo dyplex.cmo dyp.cmo
 	$(CAMLC) -a -o dyp.cma priority_by_relation.cmo automaton.cmo dyplex.cmo dyp.cmo
diff -u -r /tmp/dypgen/dyplib/dyp.ml ./dyplib/dyp.ml
--- /tmp/dypgen/dyplib/dyp.ml	2012-06-19 00:05:08.000000000 +0200
+++ ./dyplib/dyp.ml	2023-09-19 10:51:24.448094205 +0200
@@ -4572,7 +4572,7 @@
 
 
 
-let do_shifts tok_name tok_value prevTops lexbuf counters ppar layout lexeme next_lexeme_precursor =
+let do_shifts tok_name tok_value prevTops lexbuf counters ppar layout (lexeme:string) next_lexeme_precursor =
   let layout_flags = if layout then 3 else 2 in
   let pt =
     if !dypgen_verbose>2 then
@@ -5041,7 +5041,7 @@
   let old_start_pos = lexbuf.lb_lexbuf.lex_start_pos in
   (* ^ start might move at position 0 if end of buffer is reached *)
   (*Printf.fprintf !log_channel "first_curr_pos=%d\n" first_curr_pos;*)
-  let rec next_token res =
+  let rec next_token (res:string list) =
     let prev_curr_pos = lexbuf.lb_lexbuf.lex_curr_pos in
     let prev_start_pos = lexbuf.lb_lexbuf.lex_start_pos in
     (*Printf.fprintf !log_channel "prev_curr_pos=%d\n" prev_curr_pos;*)
@@ -5066,17 +5066,17 @@
         res
     | None, (Some ((action_id_l, pdev, _),_)) ->
       let lexeme =
-        try String.sub lexbuf.lb_lexbuf.lex_buffer prev_curr_pos len
+        try Bytes.sub lexbuf.lb_lexbuf.lex_buffer prev_curr_pos len
         with Invalid_argument("String.sub") ->
-          (Printf.printf "1; %s\n" lexbuf.lb_lexbuf.lex_buffer;
+          (Printf.printf "1; %s\n" (Bytes.unsafe_to_string lexbuf.lb_lexbuf.lex_buffer);
           raise (Invalid_argument("String.sub")))
       in
        (if !dypgen_verbose>2 then
          output_string !log_channel "next_lexeme called bis\n";
-       next_token (lexeme::res))
+       next_token ((Bytes.unsafe_to_string lexeme)::res))
     | (Some ((action_id_l, pdev, _),_)), _ ->
       let lexeme =
-        try String.sub lexbuf.lb_lexbuf.lex_buffer prev_curr_pos len
+        try Bytes.sub lexbuf.lb_lexbuf.lex_buffer prev_curr_pos len
         with Invalid_argument("String.sub") ->
           (Printf.printf "2; %i, %i\n" prev_curr_pos len;
           raise (Invalid_argument("String.sub")))
@@ -5084,7 +5084,7 @@
         (lexbuf.lb_lexbuf.lex_curr_pos <- first_curr_pos;
         (*Printf.printf "next_lexeme, lex_curr_pos=%d, lex_start_pos=%d, lex_abs_pos=%d\n"
         lexbuf.lb_lexbuf.lex_curr_pos lexbuf.lb_lexbuf.lex_start_pos lexbuf.lb_lexbuf.lex_abs_pos*)
-          lexeme::res)
+          (Bytes.unsafe_to_string lexeme)::res)
   in
   next_token []
   (*let l = next_token [] in
diff -u -r /tmp/dypgen/dyplib/dyp.mli ./dyplib/dyp.mli
--- /tmp/dypgen/dyplib/dyp.mli	2012-03-14 07:33:43.000000000 +0100
+++ ./dyplib/dyp.mli	2023-09-19 10:53:13.556763468 +0200
@@ -215,7 +215,7 @@
 
 val from_function :
   ('token,'obj,'global_data,'local_data,'lexbuf) parser_pilot ->
-  (string -> int -> int) ->
+  (bytes -> int -> int) ->
   'obj dyplexbuf
 
 val dyplex_lexbuf_position :
diff -u -r /tmp/dypgen/dyplib/dyplex.ml ./dyplib/dyplex.ml
--- /tmp/dypgen/dyplib/dyplex.ml	2012-04-19 11:36:11.000000000 +0200
+++ ./dyplib/dyplex.ml	2023-09-19 10:42:54.528966155 +0200
@@ -587,13 +587,13 @@
         lexbuf.lex_curr_pos <- p+1;
         if !dypgen_verbose>4 then
           (Printf.fprintf !log_channel
-          "lex_engine reads: `%c'\n" lexbuf.lex_buffer.[p]);
-        try Char.code lexbuf.lex_buffer.[p]
+          "lex_engine reads: `%c'\n" (Bytes.get lexbuf.lex_buffer p));
+        try Char.code (Bytes.get lexbuf.lex_buffer p)
         with Invalid_argument("index out of bounds")
         -> (Printf.printf "%d, %d, %s, %d, %d\n"
          lexbuf.lex_curr_pos lexbuf.lex_buffer_len
          (string_of_bool reset_start_pos)
-         p (String.length lexbuf.lex_buffer);
+         p (Bytes.length lexbuf.lex_buffer);
         raise (Invalid_argument("index out of bounds")))
     in
     let aux_lex (new_state_list,valid_lex) tbl state =

mlemerre avatar Sep 19 '23 09:09 mlemerre