# 35 "utils/SExprLexer.mll"
 
  
  (** Lexer: Lexer Specification for S-expressions *)


  open Printf
  open Lexing
  open SExprParser

  let char_for_backslash = function
    | 'n' -> '\010'
    | 'r' -> '\013'
    | 'b' -> '\008'
    | 't' -> '\009'
    | c -> c

  let lf = '\010'

  let dec_code c1 c2 c3 =
    100 * (Char.code c1 - 48) + 10 * (Char.code c2 - 48) + (Char.code c3 - 48)

  let hex_code c1 c2 =
    let d1 = Char.code c1 in
    let val1 =
      if d1 >= 97 then d1 - 87
      else if d1 >= 65 then d1 - 55
      else d1 - 48 in
    let d2 = Char.code c2 in
    let val2 =
      if d2 >= 97 then d2 - 87
      else if d2 >= 65 then d2 - 55
      else d2 - 48 in
    val1 * 16 + val2

  let found_newline ({ lex_curr_p; _ } as lexbuf) diff =
    lexbuf.lex_curr_p <-
      {
        lex_curr_p with
        pos_lnum = lex_curr_p.pos_lnum + 1;
        pos_bol = lex_curr_p.pos_cnum - diff;
      }

  (* same length computation as in [Lexing.lexeme] *)
  let lexeme_len { lex_start_pos; lex_curr_pos; _ } = lex_curr_pos - lex_start_pos

  let main_failure lexbuf msg =
    let { pos_lnum; pos_bol; pos_cnum; pos_fname = _ } = lexeme_start_p lexbuf in
    let msg =
      sprintf
        "Sexplib.Lexer.main: %s at line %d char %d"
        msg pos_lnum (pos_cnum - pos_bol)
    in
    failwith msg

# 55 "utils/SExprLexer.ml"
let __ocaml_lex_tables = {
  Lexing.lex_base = 
   "\000\000\244\255\010\000\001\000\015\000\251\255\252\255\253\255\001\000\006\000\006\000\255\255\249\255\250\255\248\255\002\000\048\000\053\000\058\000\019\000\246\255\038\000\248\255\093\000\255\255\249\255\179\000\103\000\252\255\007\000\022\000\043\000\113\000\251\255\011\001\250\255\016\000\246\255\086\000\248\255\082\001\255\255\249\255\116\001\144\000\252\255\011\000\068\000\069\000\166\000\251\255\171\001\250\255\087\000\250\255\253\255\229\000\255\255\233\000\249\000\252\255\251\255\251\000\255\000\002\000\004\000\255\255";
  Lexing.lex_backtrk = 
   "\255\255\255\255\010\000\008\000\010\000\255\255\255\255\255\255\001\000\001\000\255\255\255\255\255\255\255\255\255\255\255\255\010\000\009\000\009\000\255\255\255\255\008\000\255\255\255\255\255\255\255\255\006\000\006\000\255\255\006\000\001\000\002\000\255\255\255\255\255\255\255\255\255\255\255\255\008\000\255\255\255\255\255\255\255\255\006\000\006\000\255\255\006\000\001\000\002\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\001\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\001\000\001\000\255\255";
  Lexing.lex_default = 
   "\002\000\000\000\002\000\255\255\002\000\000\000\000\000\000\000\008\000\255\255\255\255\000\000\000\000\000\000\000\000\255\255\002\000\018\000\018\000\021\000\000\000\021\000\000\000\025\000\000\000\000\000\255\255\255\255\000\000\255\255\255\255\255\255\255\255\000\000\255\255\000\000\038\000\000\000\038\000\000\000\042\000\000\000\000\000\255\255\255\255\000\000\255\255\255\255\255\255\255\255\000\000\255\255\000\000\056\000\000\000\000\000\056\000\000\000\056\000\056\000\000\000\000\000\056\000\056\000\065\000\065\000\000\000";
  Lexing.lex_trans = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\009\000\011\000\255\255\009\000\010\000\255\255\009\000\011\000\031\000\009\000\255\255\255\255\048\000\255\255\255\255\255\255\255\255\039\000\255\255\255\255\022\000\000\000\030\000\009\000\000\000\005\000\004\000\014\000\018\000\009\000\000\000\007\000\006\000\255\255\000\000\255\255\016\000\000\000\255\255\255\255\255\255\255\255\255\255\031\000\024\000\030\000\255\255\255\255\255\255\255\255\008\000\255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\013\000\031\000\000\000\047\000\048\000\000\000\255\255\000\000\255\255\016\000\000\000\255\255\000\000\255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\000\000\255\255\057\000\255\255\255\255\047\000\048\000\000\000\030\000\000\000\000\000\029\000\255\255\040\000\000\000\000\000\023\000\255\255\000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\055\000\059\000\000\000\003\000\028\000\000\000\028\000\000\000\000\000\255\255\000\000\028\000\000\000\015\000\000\000\000\000\000\000\000\000\012\000\041\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\000\000\017\000\000\000\000\000\000\000\000\000\255\255\255\255\000\000\000\000\000\000\255\255\000\000\000\000\028\000\000\000\000\000\000\000\000\000\000\000\028\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\000\000\028\000\000\000\000\000\000\000\028\000\000\000\028\000\255\255\058\000\000\000\026\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\000\000\000\000\000\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\000\000\000\000\255\255\000\000\000\000\000\000\057\000\034\000\034\000\034\000\034\000\034\000\034\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\255\255\066\000\057\000\255\255\255\255\000\000\255\255\063\000\255\255\255\255\055\000\061\000\000\000\000\000\255\255\037\000\000\000\000\000\020\000\034\000\034\000\034\000\034\000\034\000\034\000\000\000\055\000\059\000\255\255\255\255\000\000\000\000\255\255\063\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\255\255\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\035\000\035\000\035\000\035\000\035\000\035\000\000\000\000\000\000\000\000\000\255\255\054\000\000\000\000\000\000\000\000\000\047\000\255\255\000\000\046\000\000\000\062\000\000\000\000\000\000\000\058\000\000\000\000\000\000\000\000\000\000\000\000\000\035\000\035\000\035\000\035\000\035\000\035\000\045\000\000\000\045\000\060\000\000\000\062\000\000\000\045\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\000\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\045\000\000\000\000\000\000\000\000\000\000\000\045\000\051\000\051\000\051\000\051\000\051\000\051\000\000\000\000\000\000\000\000\000\000\000\045\000\000\000\000\000\000\000\045\000\000\000\045\000\000\000\000\000\000\000\043\000\000\000\000\000\000\000\045\000\000\000\000\000\000\000\000\000\000\000\000\000\051\000\051\000\051\000\051\000\051\000\051\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\255\255\000\000\000\000\000\000\255\255\000\000\000\000\052\000\052\000\052\000\052\000\052\000\052\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\000\000\255\255\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\052\000\052\000\052\000\052\000\052\000\052\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_check = 
   "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\008\000\000\000\000\000\008\000\009\000\010\000\029\000\009\000\002\000\002\000\046\000\002\000\002\000\004\000\004\000\036\000\004\000\004\000\019\000\255\255\030\000\000\000\255\255\000\000\000\000\003\000\015\000\009\000\255\255\000\000\000\000\002\000\255\255\002\000\002\000\255\255\004\000\021\000\004\000\002\000\002\000\031\000\019\000\030\000\004\000\004\000\016\000\016\000\000\000\016\000\016\000\017\000\017\000\255\255\017\000\017\000\018\000\018\000\002\000\018\000\018\000\021\000\255\255\004\000\031\000\255\255\047\000\048\000\255\255\016\000\255\255\016\000\016\000\255\255\017\000\255\255\017\000\016\000\016\000\018\000\255\255\018\000\017\000\017\000\255\255\038\000\053\000\018\000\018\000\047\000\048\000\255\255\023\000\255\255\255\255\023\000\016\000\036\000\255\255\255\255\019\000\017\000\255\255\255\255\255\255\255\255\018\000\255\255\255\255\255\255\053\000\053\000\255\255\000\000\023\000\255\255\023\000\255\255\255\255\021\000\255\255\023\000\255\255\002\000\255\255\255\255\255\255\255\255\004\000\036\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\255\255\016\000\255\255\255\255\255\255\255\255\017\000\038\000\255\255\255\255\255\255\018\000\255\255\255\255\023\000\255\255\255\255\255\255\255\255\255\255\023\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\255\255\023\000\255\255\255\255\255\255\023\000\255\255\023\000\038\000\053\000\255\255\023\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\255\255\255\255\255\255\026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\255\255\255\255\056\000\255\255\255\255\255\255\058\000\026\000\026\000\026\000\026\000\026\000\026\000\255\255\255\255\255\255\255\255\255\255\255\255\000\000\008\000\064\000\059\000\065\000\062\000\255\255\056\000\056\000\063\000\002\000\058\000\058\000\255\255\255\255\004\000\036\000\255\255\255\255\019\000\026\000\026\000\026\000\026\000\026\000\026\000\255\255\059\000\059\000\062\000\062\000\255\255\255\255\063\000\063\000\255\255\255\255\255\255\021\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\016\000\255\255\255\255\255\255\255\255\017\000\255\255\255\255\255\255\255\255\018\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\034\000\034\000\034\000\034\000\034\000\034\000\255\255\255\255\255\255\255\255\038\000\053\000\255\255\255\255\255\255\255\255\040\000\023\000\255\255\040\000\255\255\056\000\255\255\255\255\255\255\058\000\255\255\255\255\255\255\255\255\255\255\255\255\034\000\034\000\034\000\034\000\034\000\034\000\040\000\255\255\040\000\059\000\255\255\062\000\255\255\040\000\255\255\063\000\255\255\255\255\255\255\255\255\255\255\255\255\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\040\000\255\255\255\255\255\255\255\255\255\255\040\000\043\000\043\000\043\000\043\000\043\000\043\000\255\255\255\255\255\255\255\255\255\255\040\000\255\255\255\255\255\255\040\000\255\255\040\000\255\255\255\255\255\255\040\000\255\255\255\255\255\255\040\000\255\255\255\255\255\255\255\255\255\255\255\255\043\000\043\000\043\000\043\000\043\000\043\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\056\000\255\255\255\255\255\255\058\000\255\255\255\255\051\000\051\000\051\000\051\000\051\000\051\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\059\000\255\255\062\000\255\255\255\255\255\255\063\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\051\000\051\000\051\000\051\000\051\000\051\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\040\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255";
  Lexing.lex_base_code = 
   "";
  Lexing.lex_backtrk_code = 
   "";
  Lexing.lex_default_code = 
   "";
  Lexing.lex_trans_code = 
   "";
  Lexing.lex_check_code = 
   "";
  Lexing.lex_code = 
   "";
}

let rec main buf lexbuf =
    __ocaml_lex_main_rec buf lexbuf 0
and __ocaml_lex_main_rec buf lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 100 "utils/SExprLexer.mll"
                     ( found_newline lexbuf 0; main buf lexbuf )
# 282 "utils/SExprLexer.ml"

  | 1 ->
# 101 "utils/SExprLexer.mll"
                              ( main buf lexbuf )
# 287 "utils/SExprLexer.ml"

  | 2 ->
# 102 "utils/SExprLexer.mll"
        ( LPAREN )
# 292 "utils/SExprLexer.ml"

  | 3 ->
# 103 "utils/SExprLexer.mll"
        ( RPAREN )
# 297 "utils/SExprLexer.ml"

  | 4 ->
# 105 "utils/SExprLexer.mll"
      (
        scan_string buf (lexeme_start_p lexbuf) lexbuf;
        let str = Buffer.contents buf in
        Buffer.clear buf;
        STRING (HString.mk_hstring str)
      )
# 307 "utils/SExprLexer.ml"

  | 5 ->
# 111 "utils/SExprLexer.mll"
         ( HASH_SEMI )
# 312 "utils/SExprLexer.ml"

  | 6 ->
# 113 "utils/SExprLexer.mll"
      (
        scan_block_comment buf [lexeme_start_p lexbuf] lexbuf;
        main buf lexbuf
      )
# 320 "utils/SExprLexer.ml"

  | 7 ->
# 117 "utils/SExprLexer.mll"
         ( main_failure lexbuf "illegal end of comment" )
# 325 "utils/SExprLexer.ml"

  | 8 ->
# 119 "utils/SExprLexer.mll"
    (
      scan_quoted buf (lexeme_start_p lexbuf) lexbuf;
      let str = Buffer.contents buf in
      Buffer.clear buf;
      STRING (HString.mk_hstring ("|"^ str ^"|"))
    )
# 335 "utils/SExprLexer.ml"

  | 9 ->
# 127 "utils/SExprLexer.mll"
      ( main_failure lexbuf "comment tokens in unquoted atom" )
# 340 "utils/SExprLexer.ml"

  | 10 ->
let
# 128 "utils/SExprLexer.mll"
                                      str
# 346 "utils/SExprLexer.ml"
Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
# 128 "utils/SExprLexer.mll"
                                          ( STRING (HString.mk_hstring str) )
# 350 "utils/SExprLexer.ml"

  | 11 ->
# 130 "utils/SExprLexer.mll"
        ( EOF )
# 355 "utils/SExprLexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; 
      __ocaml_lex_main_rec buf lexbuf __ocaml_lex_state

and scan_string buf start lexbuf =
    __ocaml_lex_scan_string_rec buf start lexbuf 19
and __ocaml_lex_scan_string_rec buf start lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 133 "utils/SExprLexer.mll"
        ( () )
# 367 "utils/SExprLexer.ml"

  | 1 ->
# 135 "utils/SExprLexer.mll"
      (
        found_newline lexbuf (lexeme_len lexbuf - 2);
        scan_string buf start lexbuf
      )
# 375 "utils/SExprLexer.ml"

  | 2 ->
# 140 "utils/SExprLexer.mll"
      (
        found_newline lexbuf (lexeme_len lexbuf - 3);
        scan_string buf start lexbuf
      )
# 383 "utils/SExprLexer.ml"

  | 3 ->
let
# 144 "utils/SExprLexer.mll"
                                                 c
# 389 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1) in
# 145 "utils/SExprLexer.mll"
      (
        Buffer.add_char buf (char_for_backslash c);
        scan_string buf start lexbuf
      )
# 396 "utils/SExprLexer.ml"

  | 4 ->
let
# 149 "utils/SExprLexer.mll"
                   c1
# 402 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1)
and
# 149 "utils/SExprLexer.mll"
                                 c2
# 407 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 2)
and
# 149 "utils/SExprLexer.mll"
                                               c3
# 412 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 3) in
# 150 "utils/SExprLexer.mll"
      (
        let v = dec_code c1 c2 c3 in
        if v > 255 then (
          let { pos_lnum; pos_bol; pos_cnum; _ } = lexeme_end_p lexbuf in
          let msg =
            sprintf
              "Sexplib.Lexer.scan_string: illegal escape at line %d char %d: `\\%c%c%c'"
              pos_lnum (pos_cnum - pos_bol - 3)
              c1 c2 c3 in
          failwith msg);
        Buffer.add_char buf (Char.chr v);
        scan_string buf start lexbuf
      )
# 429 "utils/SExprLexer.ml"

  | 5 ->
let
# 164 "utils/SExprLexer.mll"
                          c1
# 435 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 2)
and
# 164 "utils/SExprLexer.mll"
                                           c2
# 440 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 3) in
# 165 "utils/SExprLexer.mll"
      (
        let v = hex_code c1 c2 in
        Buffer.add_char buf (Char.chr v);
        scan_string buf start lexbuf
      )
# 448 "utils/SExprLexer.ml"

  | 6 ->
let
# 170 "utils/SExprLexer.mll"
               c
# 454 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1) in
# 171 "utils/SExprLexer.mll"
      (
        Buffer.add_char buf '\\';
        Buffer.add_char buf c;
        scan_string buf start lexbuf
      )
# 462 "utils/SExprLexer.ml"

  | 7 ->
# 177 "utils/SExprLexer.mll"
      (
        found_newline lexbuf 0;
        Buffer.add_char buf lf;
        scan_string buf start lexbuf
      )
# 471 "utils/SExprLexer.ml"

  | 8 ->
# 183 "utils/SExprLexer.mll"
      (
        Buffer.add_string buf (lexeme lexbuf);
        scan_string buf start lexbuf
      )
# 479 "utils/SExprLexer.ml"

  | 9 ->
# 188 "utils/SExprLexer.mll"
      (
        let msg =
          sprintf
            "Sexplib.Lexer.scan_string: unterminated string at line %d char %d"
            start.pos_lnum (start.pos_cnum - start.pos_bol)
        in
        failwith msg
      )
# 491 "utils/SExprLexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; 
      __ocaml_lex_scan_string_rec buf start lexbuf __ocaml_lex_state

and scan_quoted buf start lexbuf =
    __ocaml_lex_scan_quoted_rec buf start lexbuf 36
and __ocaml_lex_scan_quoted_rec buf start lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 198 "utils/SExprLexer.mll"
        ( () )
# 503 "utils/SExprLexer.ml"

  | 1 ->
# 200 "utils/SExprLexer.mll"
      (
        found_newline lexbuf (lexeme_len lexbuf - 2);
        scan_quoted buf start lexbuf
      )
# 511 "utils/SExprLexer.ml"

  | 2 ->
# 205 "utils/SExprLexer.mll"
      (
        found_newline lexbuf (lexeme_len lexbuf - 3);
        scan_quoted buf start lexbuf
      )
# 519 "utils/SExprLexer.ml"

  | 3 ->
let
# 209 "utils/SExprLexer.mll"
                                                     c
# 525 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1) in
# 210 "utils/SExprLexer.mll"
      (
        Buffer.add_char buf (char_for_backslash c);
        scan_quoted buf start lexbuf
      )
# 532 "utils/SExprLexer.ml"

  | 4 ->
let
# 214 "utils/SExprLexer.mll"
                   c1
# 538 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1)
and
# 214 "utils/SExprLexer.mll"
                                 c2
# 543 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 2)
and
# 214 "utils/SExprLexer.mll"
                                               c3
# 548 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 3) in
# 215 "utils/SExprLexer.mll"
      (
        let v = dec_code c1 c2 c3 in
        if v > 255 then (
          let { pos_lnum; pos_bol; pos_cnum; _ } = lexeme_end_p lexbuf in
          let msg =
            sprintf
              "Sexplib.Lexer.scan_quoted: illegal escape at line %d char %d: `\\%c%c%c'"
              pos_lnum (pos_cnum - pos_bol - 3)
              c1 c2 c3 in
          failwith msg);
        Buffer.add_char buf (Char.chr v);
        scan_quoted buf start lexbuf
      )
# 565 "utils/SExprLexer.ml"

  | 5 ->
let
# 229 "utils/SExprLexer.mll"
                          c1
# 571 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 2)
and
# 229 "utils/SExprLexer.mll"
                                           c2
# 576 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 3) in
# 230 "utils/SExprLexer.mll"
      (
        let v = hex_code c1 c2 in
        Buffer.add_char buf (Char.chr v);
        scan_quoted buf start lexbuf
      )
# 584 "utils/SExprLexer.ml"

  | 6 ->
let
# 235 "utils/SExprLexer.mll"
               c
# 590 "utils/SExprLexer.ml"
Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1) in
# 236 "utils/SExprLexer.mll"
      (
        Buffer.add_char buf '\\';
        Buffer.add_char buf c;
        scan_quoted buf start lexbuf
      )
# 598 "utils/SExprLexer.ml"

  | 7 ->
# 242 "utils/SExprLexer.mll"
      (
        found_newline lexbuf 0;
        Buffer.add_char buf lf;
        scan_quoted buf start lexbuf
      )
# 607 "utils/SExprLexer.ml"

  | 8 ->
# 248 "utils/SExprLexer.mll"
      (
        Buffer.add_string buf (lexeme lexbuf);
        scan_quoted buf start lexbuf
      )
# 615 "utils/SExprLexer.ml"

  | 9 ->
# 253 "utils/SExprLexer.mll"
      (
        let msg =
          sprintf
            "Sexplib.Lexer.scan_quoted: unterminated ident at line %d char %d"
            start.pos_lnum (start.pos_cnum - start.pos_bol)
        in
        failwith msg
      )
# 627 "utils/SExprLexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; 
      __ocaml_lex_scan_quoted_rec buf start lexbuf __ocaml_lex_state

and scan_block_comment buf locs lexbuf =
    __ocaml_lex_scan_block_comment_rec buf locs lexbuf 53
and __ocaml_lex_scan_block_comment_rec buf locs lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 264 "utils/SExprLexer.mll"
      ( found_newline lexbuf 0; scan_block_comment buf locs lexbuf )
# 639 "utils/SExprLexer.ml"

  | 1 ->
# 265 "utils/SExprLexer.mll"
                                          ( scan_block_comment buf locs lexbuf )
# 644 "utils/SExprLexer.ml"

  | 2 ->
# 267 "utils/SExprLexer.mll"
      (
        let cur = lexeme_end_p lexbuf in
        let start = { cur with pos_cnum = cur.pos_cnum - 1 } in
        scan_string buf start lexbuf;
        Buffer.clear buf;
        scan_block_comment buf locs lexbuf
      )
# 655 "utils/SExprLexer.ml"

  | 3 ->
# 275 "utils/SExprLexer.mll"
    (
      let cur = lexeme_end_p lexbuf in
      let start = { cur with pos_cnum = cur.pos_cnum - 2 } in
      scan_block_comment buf (start :: locs) lexbuf
    )
# 664 "utils/SExprLexer.ml"

  | 4 ->
# 281 "utils/SExprLexer.mll"
      (
        match locs with
        | [_] -> ()
        | _ :: t -> scan_block_comment buf t lexbuf
        | [] -> assert false  (* impossible *)
      )
# 674 "utils/SExprLexer.ml"

  | 5 ->
# 288 "utils/SExprLexer.mll"
      (
        match locs with
        | [] -> assert false
        | { pos_lnum; pos_bol; pos_cnum; _ } :: _ ->
            let msg =
              sprintf "Sexplib.Lexer.scan_block_comment: unterminated block comment at line %d char %d"
                pos_lnum (pos_cnum - pos_bol)
            in
            failwith msg
      )
# 689 "utils/SExprLexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; 
      __ocaml_lex_scan_block_comment_rec buf locs lexbuf __ocaml_lex_state

and ruleTail acc lexbuf =
    __ocaml_lex_ruleTail_rec acc lexbuf 64
and __ocaml_lex_ruleTail_rec acc lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 301 "utils/SExprLexer.mll"
        ( acc )
# 701 "utils/SExprLexer.ml"

  | 1 ->
let
# 302 "utils/SExprLexer.mll"
          str
# 707 "utils/SExprLexer.ml"
Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
# 302 "utils/SExprLexer.mll"
              ( ruleTail (acc ^ str) lexbuf )
# 711 "utils/SExprLexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; 
      __ocaml_lex_ruleTail_rec acc lexbuf __ocaml_lex_state

;;

# 305 "utils/SExprLexer.mll"
 
  let main ?buf =
    let buf =
      match buf with
      | None -> Buffer.create 64
      | Some buf -> Buffer.clear buf; buf
    in
    main buf

# 728 "utils/SExprLexer.ml"