diff --git a/src/e_regexp.ml b/src/e_regexp.ml
index 1872417beb4b354c0cebbd57061a78486f2df761..403fa09172a452cea444cee746ff0bfc1924c033 100644
--- a/src/e_regexp.ml
+++ b/src/e_regexp.ml
@@ -111,7 +111,7 @@ let list_regexp =
      fun s ->
        match String.get s 1 with
        | a -> Some (SYM_CHARACTER a)
-       | exception Invalid_argument _ -> Some (SYM_CHARACTER '\x00')
+       | exception Invalid_argument _ -> Some (SYM_CHARACTER 'a')
     );
     (Cat (char_regexp '\'', Cat (char_regexp '\\',
           Cat (char_range (char_list_of_string "\\tn0"),
@@ -120,9 +120,9 @@ let list_regexp =
          | '\\' -> Some (SYM_CHARACTER '\\')
          | 'n' -> Some (SYM_CHARACTER '\n')
          | 't' -> Some (SYM_CHARACTER '\t')
-         | '0' -> Some (SYM_CHARACTER '\x00')
+         | '0' -> Some (SYM_CHARACTER 'a')
          | _ -> None
-         | exception _ -> Some (SYM_CHARACTER '\x00')
+         | exception _ -> Some (SYM_CHARACTER 'a')
     );
     (Cat (char_regexp '"',
           Cat (Star (
diff --git a/src/lexer_generator.ml b/src/lexer_generator.ml
index 5e4f0d3dbf678dec7d53cb186a1fa0aa7baaf61d..fe942dc3935411c9ef3ae876e7861da75081eef6 100644
--- a/src/lexer_generator.ml
+++ b/src/lexer_generator.ml
@@ -349,10 +349,14 @@ let char_list_to_char_ranges s =
       )
   in
   let l = recognize_range (List.sort Stdlib.compare (List.map Char.code s)) [] None 0 in
+  let escape_char c =
+    if c = '"'
+    then "\\\"" else Printf.sprintf "%c" c in
   List.fold_left (fun acc (c,n) ->
       if n = 0
-      then Printf.sprintf "%c%s" (Char.chr c) acc
-      else Printf.sprintf "%c-%c%s" (Char.chr c) (Char.chr (c + n)) acc
+      then Printf.sprintf "%s%s" (escape_char (Char.chr c)) acc
+      else Printf.sprintf "%s-%s%s" (escape_char (Char.chr c))
+          (escape_char (Char.chr (c + n))) acc
     ) "" l