# 26 "editor/ed_ocaml_lexer.mll"
 
open Lexing

let prerr_endline _ = ()

type token =
    AMPERAMPER
  | AMPERSAND
  | AND
  | AS
  | ASSERT
  | BACKQUOTE
  | BAR
  | BARBAR
  | BARRBRACKET
  | BEGIN
  | CHAR
  | CLASS
  | COLON
  | COLONCOLON
  | COLONEQUAL
  | COLONGREATER
  | COMMA
  | CONSTRAINT
  | DO
  | DONE
  | DOT
  | DOTDOT
  | DOWNTO
  | ELSE
  | END
  | EOF
  | EQUAL
  | EXCEPTION
  | EXTERNAL
  | FALSE
  | FLOAT
  | FOR
  | FUN
  | FUNCTION
  | FUNCTOR
  | GREATER
  | GREATERRBRACE
  | GREATERRBRACKET
  | IF
  | IN
  | INCLUDE
  | INFIXOP0
  | INFIXOP1
  | INFIXOP2
  | INFIXOP3
  | INFIXOP4
  | INHERIT
  | INITIALIZER
  | INT | INT32 | INT64 | NATIVEINT
  | LABEL of string
  | LAZY
  | LBRACE
  | LBRACELESS
  | LBRACKET
  | LBRACKETBAR
  | LBRACKETGREATER
  | LBRACKETLESS
  | LESS
  | LESSMINUS
  | LET
  | LIDENT
  | LPAREN
  | MATCH
  | METHOD
  | MINUS
  | MINUSDOT
  | MINUSGREATER
  | MODULE
  | MUTABLE
  | NEW
  | OBJECT
  | OF
  | OPEN
  | OPTLABEL of string
  | OR
  | PARSER
  | PLUS
  | PREFIXOP
  | PRIVATE
  | QUESTION
  | QUESTIONQUESTION
  | QUOTE
  | RBRACE
  | RBRACKET
  | REC
  | RPAREN
  | SEMI
  | SEMISEMI
  | SHARP
  | SIG
  | STAR
  | STRING
  | STRUCT
  | SUBTRACTIVE
  | THEN
  | TO
  | TRUE
  | TRY
  | TYPE
  | UIDENT
  | UNDERSCORE
  | VAL
  | VIRTUAL
  | WHEN
  | WHILE
  | WITH
  | COMMENT
  | EOL
  | EOFCOMMENT
  | EOFSTRING
  | ERROR
(* for lexers *)
  | RULE
  | PARSE

type error =
  | Illegal_character of char
  | Illegal_escape of string
  | Unterminated_comment
  | Unterminated_string
  | Keyword_as_label of string
  | Literal_overflow of string
  | End_with_no_begin of string
;;

(** start and stop positions in characters *)

type location = int * int

let curr_loc lexbuf =
  (lexbuf.Lexing.lex_start_p.Lexing.pos_cnum,
   lexbuf.Lexing.lex_curr_p.Lexing.pos_cnum)

exception Error of error * location

(* The table of keywords *)

let token_kw =
  [
    "and"AND;
    "as"AS;
    "assert"ASSERT;
    "begin"BEGIN;
    "class"CLASS;
    "constraint"CONSTRAINT;
    "do"DO;
    "done"DONE;
    "downto"DOWNTO;
    "else"ELSE;
    "end"END;
    "exception"EXCEPTION;
    "external"EXTERNAL;
    "false"FALSE;
    "for"FOR;
    "fun"FUN;
    "function"FUNCTION;
    "functor"FUNCTOR;
    "if"IF;
    "in"IN;
    "include"INCLUDE;
    "inherit"INHERIT;
    "initializer"INITIALIZER;
    "lazy"LAZY;
    "let"LET;
    "match"MATCH;
    "method"METHOD;
    "module"MODULE;
    "mutable"MUTABLE;
    "new"NEW;
    "object"OBJECT;
    "of"OF;
    "open"OPEN;
    "or"OR;
(*  "parser", PARSER; *)
    "private"PRIVATE;
    "rec"REC;
    "sig"SIG;
    "struct"STRUCT;
    "then"THEN;
    "to"TO;
    "true"TRUE;
    "try"TRY;
    "type"TYPE;
    "val"VAL;
    "virtual"VIRTUAL;
    "when"WHEN;
    "while"WHILE;
    "with"WITH;

    "mod"INFIXOP3 ;
    "land"INFIXOP3 ;
    "lor"INFIXOP3 ;
    "lxor"INFIXOP3 ;
    "lsl"INFIXOP4 ;
    "lsr"INFIXOP4 ;
    "asr"INFIXOP4 ;
    ]

let keyword_table = Hashtbl.create 149
let _ = List.iter
    (fun (k,v) -> Hashtbl.add keyword_table k v)
    token_kw

(* To translate escape sequences *)

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

let char_for_decimal_code lexbuf i =
(*  let c = 100 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) +
           10 * (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) +
                (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in
  if (c < 0 || c > 255) && not (in_comment ())
  then raise (Error(Illegal_escape (Lexing.lexeme lexbuf),
                    curr_loc lexbuf))
  else Char.chr c
*)

  'x'
let char_for_hexadecimal_code lexbuf i =
(*
  let d1 = Char.code (Lexing.lexeme_char lexbuf i) in
  let val1 = if d1 >= 97 then d1 - 87
             else if d1 >= 65 then d1 - 55
             else d1 - 48
  in
  let d2 = Char.code (Lexing.lexeme_char lexbuf (i+1)) in
  let val2 = if d2 >= 97 then d2 - 87
             else if d2 >= 65 then d2 - 55
             else d2 - 48
  in
  Char.chr (val1 * 16 + val2)
*)

  'x'

(* Remove underscores from float literals *)

let remove_underscores s =
  let l = String.length s in
  let rec remove src dst =
    if src >= l then
      if dst >= l then s else String.sub s 0 dst
    else
      match s.[src] with
        '_' -> remove (src + 1) dst
      |  c  -> s.[dst] <- c; remove (src + 1) (dst + 1)
  in remove 0 0

(* Update the current location with file name and line number. *)

let update_loc lexbuf file line absolute chars =
  let pos = lexbuf.lex_curr_p in
  let new_file = match file with
                 | None -> pos.pos_fname
                 | Some s -> s
  in
  lexbuf.lex_curr_p <- { pos with
    pos_fname = new_file;
    pos_lnum = if absolute then line else pos.pos_lnum + line;
    pos_bol = pos.pos_cnum - chars;
  }
;;

(* Error report *)

let report_error = function
  | Illegal_character c ->
      Printf.sprintf "Illegal character (%s)" (Char.escaped c)
  | Illegal_escape s ->
      Printf.sprintf "Illegal backslash escape in string or character (%s)" s
  | Unterminated_comment ->
      Printf.sprintf "Comment not terminated"
  | Unterminated_string ->
      Printf.sprintf "String literal not terminated"
  | Keyword_as_label kwd ->
      Printf.sprintf "`%s' is a keyword, it cannot be used as label name" kwd
  | Literal_overflow ty ->
      Printf.sprintf "Integer literal exceeds the range of representable integers of type %s" ty
  | End_with_no_begin s ->
      Printf.sprintf "The closing '%s' has no matching open equivalent" s
;;


(* Block stack *)

let blocks = ref []

type cst_indent = {
    ind_newline : int ;
    ind_bracket : int ;
    ind_brace : int ;
    ind_parent : int ;
    ind_let : int ;
    ind_begin : int ;
    ind_match : int ;
    ind_comment : int ;
    ind_if : int ;
    ind_fun : int ;
    ind_struct : int ;
    ind_object : int ;
    ind_class : int ;
    ind_module : int ;
    ind_type : int ;
    ind_exception : int ;
    ind_loop : int;
    ind_field : int ;
    ind_val : int;
  }

let default_indent = {
  ind_newline = 2 ;
  ind_bracket = 2 ;
  ind_brace = 2 ;
  ind_parent = 1 ;
  ind_let = 2 ;
  ind_begin = 2 ;
  ind_match = 2 ;
  ind_comment = 3 ;
  ind_if = 2 ;
  ind_fun = 2 ;
  ind_struct = 2 ;
  ind_object = 2 ;
  ind_class = 2 ;
  ind_module = 2 ;
  ind_type = 2 ;
  ind_exception = 2 ;
  ind_loop = 2;
  ind_field = 2 ;
  ind_val = 2;
}
let cst_indent = ref default_indent

(* indentation for each line, in revert-order;
   Each time we encounter the first token of a line, we compute its
   indentation and add it to the list. [None] means that we should not
   touch the line (orelse this could change the blanks/tabs on the line).*)

let line_indentations = ref ([] : int option list)

let next_token_is_first = ref true
let next_line_is_more_indented = ref 0

(** Ad this indentation to the line_indentation list if we're on the first token of the line *)

let if_first_token_on_line n =
  if !next_token_is_first then
    (
     line_indentations := (Some n) :: !line_indentations;
     next_token_is_first := false
    )

let if_first_token_on_line_set_none () =
  if !next_token_is_first then
    (
     line_indentations := None :: !line_indentations;
     next_token_is_first := false
    )

let cur_indent = ref 0

let begin_comment_indentation = ref (!cur_indent, !next_line_is_more_indented)

let set_indent ?(touch_next_line=true) n =
  cur_indent := n ;
  if touch_next_line=true then
    next_line_is_more_indented := 0
let inc_indent ?(touch_next_line=true) n =
  cur_indent := !cur_indent + n;
  if touch_next_line=true then
    next_line_is_more_indented := 0
let dec_indent ?(touch_next_line=true) n =
  cur_indent := !cur_indent - n;
  if touch_next_line=true then
    next_line_is_more_indented := 0

let string_of_token =
  let l = List.map (fun (a,b) -> (b,a)) token_kw in
  fun t ->
    try List.assoc t l
    with Not_found -> "<other>"

let prerr_blocks_stack () =
  prerr_endline "Block stack is: ";
  List.iter
    (fun (tok,vext,vin) ->
      prerr_endline (Printf.sprintf "%s (%d, %+d)" (string_of_token tok) vext vin))
    !blocks

let last_popped = ref None
let rec pop tokens s lexbuf =
  match !blocks with
    [] ->
      prerr_blocks_stack ();
      raise (Error (End_with_no_begin s, curr_loc lexbuf))
  | (tok, vext, vin) :: q ->
      blocks := q;
      last_popped := Some (tok,vext,vin);
      if List.mem tok tokens then
        (
         prerr_endline (Printf.sprintf "popped %s (%d;%d)" (string_of_token tok) vext vin);
         (vext, vin)
        )
      else
        match tok with
          MATCH | TRY | FUN | FUNCTION | FUNCTOR | MINUSGREATER | MODULE
        | WITH | METHOD | VAL | ELSE | THEN | INCLUDE | LET
        | EXCEPTION | TYPE | INITIALIZER ->
             (* we can pop these ones and try with the next token
                because these contructions don't have an explicit end; *)

            pop tokens s lexbuf
        | _ ->
             (* we could jump the bad token to try to indent anyway
                but the result would be wrong *)

            prerr_blocks_stack ();
            raise (Error (End_with_no_begin s, curr_loc lexbuf))

let last_begin_let_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=LET) !blocks in
    Some (v, off)
  with Not_found -> None

let last_and_associated_indent () =
  try
    let (t,vext,vin) =
      List.find
        (fun (t,_,_) -> t=LET or t=MODULE or t=CLASS or t=TYPE)
        !blocks
    in
    Some (vext,vin)
  with Not_found -> None

let last_begin_module_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=MODULE) !blocks in
    Some (v, off)
  with Not_found -> None

let last_begin_struct_sig_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=STRUCT or t=SIG) !blocks in
    Some (v,off)
  with Not_found -> None

let last_begin_object_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=OBJECT) !blocks in
    Some (v,off)
  with Not_found -> None

let last_begin_sig_object_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=OBJECT or t=SIG) !blocks in
    Some (v,off)
  with Not_found -> None

let push tok vext vin = blocks := (tok, vext, vin) :: !blocks

let push_if_different tok v off =
  match !blocks with
    (t,_,_) :: _ when t = tok -> false
  | _ -> push tok v off; true

let begin_tokens_of_token = function
    END -> [ BEGIN ; OBJECT ; SIG ; STRUCT ]
  | IN -> [ LET ]
  | DONE -> [ DO ]
  | DO -> [ WHILE ; FOR ]
  | RPAREN -> [LPAREN]
  | RBRACE -> [LBRACE]
  | RBRACKET -> [LBRACKETLBRACKETLESSLBRACKETGREATER]
  | BARRBRACKET -> [LBRACKETBAR]
  | GREATERRBRACE -> [LBRACELESS]
  | GREATERRBRACKET -> [LBRACKETLESS]
  | WITH -> [MATCH;TRY;LBRACE]
  | THEN -> [IF]
  | ELSE -> [THEN]
  | OBJECT ->  [CLASS]
  | STRUCT | SIG -> [MODULE]
  | _ -> assert false

let last_block_indent () =
  match !blocks with
    (_,n,off) :: _ -> (n, off)
  | _ -> (0, 0)

let last_block_inner_indent () =
  let (n,off) = last_block_indent () in n + off

let nl_info_stack = Stack.create ()
let push_nl_info () =
  Stack.push !next_line_is_more_indented nl_info_stack
let pop_nl_info () =
  try next_line_is_more_indented := Stack.pop nl_info_stack
  with Stack.Empty -> ()

let on_par_open token lexbuf =
  let cst = match token with
    LPAREN -> !cst_indent.ind_parent
  | LBRACE -> !cst_indent.ind_brace
  | LBRACKET
  | LBRACKETLESS
  | LBRACKETGREATER -> !cst_indent.ind_bracket
  | _ -> !cst_indent.ind_parent
  in
  if_first_token_on_line !cur_indent;
  (* keep the indentation of this block *)
  push_nl_info ();
  push token !cur_indent cst;
  (* then increment current indentation for lines in the parenthesis *)
(*
  let pos_on_line =
    let loc = lexbuf.Lexing.lex_start_p in
    loc.Lexing.pos_cnum - loc.Lexing.pos_bol
  in
*)

  inc_indent cst

let on_par_close lexbuf token s =
  set_indent ~touch_next_line: false
    (fst (pop (begin_tokens_of_token token) s lexbuf));
(*  next_line_is_more_indented := 1;*)
  if_first_token_on_line !cur_indent;
  pop_nl_info ()

let rec on_keyword lexbuf = function
    AND ->
      (
       match last_and_associated_indent () with
         Some (n, off) ->
           set_indent (n+off);
           if_first_token_on_line n
       | None -> if_first_token_on_line !cur_indent
      )
  | AS
  | ASSERT -> if_first_token_on_line !cur_indent
  | BAR ->
      (* can be associated to a WITH, a LBRACKET or a FUNCTION *)
      (
       match !blocks with
         (WITH,n,_) :: _ ->
           if_first_token_on_line n;
       | (LBRACKET,n,_) :: _ ->
           if_first_token_on_line n;
       | (FUNCTION,n,_) :: _ ->
           if_first_token_on_line n;
       | (ELSE,_,_) :: q
       | (THEN,_,_) :: q ->
           (* A bar is the end of a then or else if we're in a match/try *)
           blocks := q;
           on_keyword lexbuf BAR
       | _ ->
           if_first_token_on_line !cur_indent
      )
  | (BEGIN | STRUCT | SIG | OBJECTas token ->
      if token = BEGIN then push_nl_info ();
      if_first_token_on_line !cur_indent;
      let cst =
        match token with
          BEGIN -> !cst_indent.ind_begin
        | STRUCT | SIG -> !cst_indent.ind_struct
        | OBJECT -> !cst_indent.ind_object
        | _ -> assert false
      in
      push token !cur_indent cst;
      inc_indent cst
  | (CLASS | MODULE | CONSTRAINT | INCLUDEas token ->
      (
       let ind =
         match token with
           CLASS -> !cst_indent.ind_class
         | _ -> !cst_indent.ind_module
       in
       match last_begin_struct_sig_indent () with
         None ->
           if_first_token_on_line 0;
           push token 0 ind;
           set_indent ind
       | Some (n, off) ->
           let n = n + off in
           if_first_token_on_line n;
           push token n ind;
           set_indent (n + ind);
      );
      prerr_endline "CLASS";
      prerr_blocks_stack()
  | DO ->
      (
       set_indent (fst (pop (begin_tokens_of_token DO"do" lexbuf)) ;
       if_first_token_on_line !cur_indent;
       push DO !cur_indent !cst_indent.ind_loop;
       inc_indent !cst_indent.ind_loop
      )
  | DONE ->
      set_indent (fst (pop (begin_tokens_of_token DONE"done" lexbuf));
      if_first_token_on_line !cur_indent
  | DOWNTO ->
      if_first_token_on_line !cur_indent
  | THEN ->
      set_indent (fst (pop (begin_tokens_of_token THEN"then" lexbuf));
      push THEN !cur_indent !cst_indent.ind_if;
      if_first_token_on_line !cur_indent;
      inc_indent !cst_indent.ind_if
  | ELSE ->
      set_indent (fst (pop (begin_tokens_of_token ELSE"else" lexbuf));
      push ELSE !cur_indent !cst_indent.ind_if;
      if_first_token_on_line !cur_indent;
      inc_indent !cst_indent.ind_if;
  | END ->
      (
       (* if it is the end of a sig, a struct or an object, then
          we must pop also the previous module or class *)

       prerr_blocks_stack();
       let (t,n,off) =
         ignore(pop (begin_tokens_of_token END"end" lexbuf);
         match !last_popped with
           None -> assert false
         | Some info -> info
       in
       if_first_token_on_line n;
       match t with
         OBJECT | SIG | STRUCT ->
           set_indent (fst (last_block_indent ()))
       | _ ->
           set_indent ~touch_next_line: false n;
           pop_nl_info ();
      )

  | (EXCEPTION | EXTERNALas token ->
      (
       match last_begin_struct_sig_indent () with
         None ->
           if_first_token_on_line 0;
           set_indent !cst_indent.ind_exception
       | Some (n, off) ->
           let n = n + off in
           if_first_token_on_line n;
           push token n !cst_indent.ind_exception;
           set_indent (n + !cst_indent.ind_exception);
      )
  | FALSE | TRUE ->
      if_first_token_on_line !cur_indent
  | FOR ->
      if_first_token_on_line !cur_indent;
      push FOR !cur_indent 0;
  | FUN ->
      if !next_token_is_first then
        (
         if_first_token_on_line !cur_indent;
         push FUN !cur_indent !cst_indent.ind_fun;
         inc_indent !cst_indent.ind_fun
        )
      else
        (
         (* to prevent incrementing various times for sequences
            of fun ... -> fun ... -> on a same line *)

         match !blocks with
           (LET, n, _) :: _
         | (METHOD, n, _) :: _
         | (VAL, n, _) :: _ ->
             ()
         | _ ->
             if push_if_different FUN !cur_indent !cst_indent.ind_fun then
               inc_indent !cst_indent.ind_fun
        )
  | FUNCTION ->
      if !next_token_is_first then
        (
         if_first_token_on_line !cur_indent;
         push FUNCTION !cur_indent !cst_indent.ind_fun;
         inc_indent !cst_indent.ind_fun
        )
      else
        (
         match !blocks with
           (LET, n, _) :: _
         | (METHOD, n, _) :: _
         | (VAL, n, _) :: _ ->
             push FUNCTION n (2 * !cst_indent.ind_fun);
             set_indent (n + !cst_indent.ind_fun)
         | _ ->
             push FUNCTION !cur_indent (2 * !cst_indent.ind_fun);
             inc_indent (2 * !cst_indent.ind_fun)
        )
  | FUNCTOR ->
      if_first_token_on_line !cur_indent;
      (* to prevent incrementing various times for sequences
         of functor ... -> functor ... -> *)

      if push_if_different FUNCTOR !cur_indent !cst_indent.ind_fun then
        inc_indent !cst_indent.ind_fun
  | IF ->
      let p = last_block_inner_indent () in
      if_first_token_on_line p;
      push IF p !cst_indent.ind_if;
      set_indent (p + !cst_indent.ind_if)
  | IN ->
      set_indent (fst (pop (begin_tokens_of_token IN"in" lexbuf));
      if_first_token_on_line !cur_indent;
  | (INHERIT | INITIALIZER | METHODas token  ->
      (
       match last_begin_object_indent () with
         None ->
           if_first_token_on_line !cur_indent;
           if token = METHOD or token = INITIALIZER then
             push token !cur_indent !cst_indent.ind_field;
           inc_indent !cst_indent.ind_field;
       | Some (n,off) ->
           if_first_token_on_line (n+off);
           if token = METHOD or token = INITIALIZER then
             push token (n + off) !cst_indent.ind_field;
           set_indent (n + off + !cst_indent.ind_field);
      )
  | VIRTUAL ->
      if_first_token_on_line !cur_indent
  | VAL ->
       (* same heuristic as for LET *)
      if !next_token_is_first then
        (
         let loc = lexbuf.Lexing.lex_start_p in
         let pos_on_line = loc.Lexing.pos_cnum - loc.Lexing.pos_bol in
         let (top_align,off) =
           match last_begin_sig_object_indent () with
             None -> (0, 0)
           | Some (n, off) -> (n, off)
          in
         let pos =
           if top_align + off >= pos_on_line then
             top_align + off
            else
             !cur_indent
         in
         if_first_token_on_line pos;
         push VAL pos !cst_indent.ind_val;
         set_indent (pos + !cst_indent.ind_val)
        )
      else
        (
         push VAL !cur_indent !cst_indent.ind_val;
         inc_indent !cst_indent.ind_val
        )
  | LAZY ->
      if_first_token_on_line !cur_indent

  | LET ->
      (* heuristic: if the let is at the beginning of a line
         with at most n blanks before, with n being the current
         struct indentation, then consider it is a "top let" and
         align it on the other elements of the struct *)

      if !next_token_is_first then
        (
         let loc = lexbuf.Lexing.lex_start_p in
         let pos_on_line = loc.Lexing.pos_cnum - loc.Lexing.pos_bol in
         let (top_align, off) =
           match last_begin_struct_sig_indent () with
             None -> (0, 0)
           | Some (n, off) -> (n, off)
         in
         let pos =
           if top_align + off >= pos_on_line then
             top_align + off
           else
             last_block_inner_indent ()
         in
         if_first_token_on_line pos;
         push LET pos !cst_indent.ind_let;
         set_indent (pos + !cst_indent.ind_let)
        )
      else
        (
         push LET !cur_indent !cst_indent.ind_let;
         inc_indent !cst_indent.ind_let
        )
  | (MATCH | TRYas token ->
      if_first_token_on_line !cur_indent;
      push token !cur_indent !cst_indent.ind_match;
      inc_indent !cst_indent.ind_match
  | MINUSGREATER ->
      (
       if_first_token_on_line !cur_indent;
       (* can be associated to FUN, WITH and FUNCTOR ...
          or nothing. *)

       try
         match !blocks with
           (FUN,_,_) :: _
         | (FUNCTOR,_,_) :: _ ->
             ()
         | (FUNCTION,n,_) :: _ ->
             set_indent (n + 2 * !cst_indent.ind_fun)
         | (WITH,n,_) :: _ ->
             set_indent (n + 2 * !cst_indent.ind_match)
         | _ ->
             ()
       with
         Not_found ->
           inc_indent !cst_indent.ind_fun
      )
  | MUTABLE ->
      if_first_token_on_line !cur_indent;
  | NEW ->
      if_first_token_on_line !cur_indent;
  | OF | OPEN | OR | PRIVATE | REC | TO ->
      if_first_token_on_line !cur_indent;
  | TYPE ->
      (
       match !blocks with
         (MODULE,_,_) :: _
       | (CLASS,_,_) :: _ ->
           (* a module/class type, indentation has already been done
              when we encounterd MODULE/CLASS; do nothing *)

           prerr_endline "nothing to be done for type";
           prerr_blocks_stack ()
       | _ ->
           match last_begin_struct_sig_indent () with
             None ->
               if_first_token_on_line 0;
               set_indent !cst_indent.ind_type
           | Some (n, off) ->
               if_first_token_on_line (n + off);
               push TYPE (n + off) !cst_indent.ind_type;
               set_indent (n + off + !cst_indent.ind_type)
      )
  | WHEN ->
      if_first_token_on_line !cur_indent;
  | WHILE ->
      if_first_token_on_line !cur_indent;
      push WHILE !cur_indent !cst_indent.ind_loop;
      inc_indent !cst_indent.ind_loop
  | WITH ->
      (
       let (n,_) = pop (begin_tokens_of_token WITH"with" lexbuf in
       match !last_popped with
         Some (LBRACE,n,off) ->
           set_indent (n + off);
           if_first_token_on_line !cur_indent;
           push LBRACE n off
       | Some (MATCH,n,off) | Some (TRY,n,off) ->
           set_indent n;
           if_first_token_on_line !cur_indent;
           push WITH n (2 * !cst_indent.ind_match);
           inc_indent !cst_indent.ind_match
       | _ ->
           if_first_token_on_line n
      )
  | INFIXOP0 | INFIXOP1 | INFIXOP2 | INFIXOP3 | INFIXOP4 ->
      if_first_token_on_line !cur_indent

  | SEMI ->
      (
       match !blocks with
         (t,n,off) :: q ->
           let indent =
             match t with
               WITH | FUNCTION -> n + off
             | ELSE | THEN ->
                 blocks := q;
                 n
             | _ -> n + off
           in
           set_indent indent;
           if_first_token_on_line !cur_indent;
       | _ ->
           if_first_token_on_line !cur_indent;
      )
  | COMMA ->
      (
       match !blocks with
         (t,n,off) :: q ->
           let indent = n + off in
           set_indent indent;
           if_first_token_on_line !cur_indent;
       | _ ->
           if_first_token_on_line !cur_indent;
      )
  | _ ->
      if_first_token_on_line !cur_indent

# 886 "editor/ed_ocaml_lexer.ml"
let __ocaml_lex_tables = {
  Lexing.lex_base = 
   "\000\000\182\255\183\255\224\000\003\001\038\001\073\001\108\001\196\255\143\001\180\001\032\000\204\255\067\000\217\001\252\001\069\000\072\000\085\000\031\002\221\255\223\255\226\255\066\002\123\000\101\002\093\000\047\001\240\255\120\002\153\002\226\002\178\003\145\004\237\004\189\005\127\000\001\000\255\255\156\006\186\006\251\255\138\007\105\008\248\255\241\255\242\255\243\255\095\000\045\003\093\000\112\000\055\003\253\003\008\006\103\002\173\004\133\000\122\008\098\000\237\000\114\000\239\255\238\255\234\255\097\005\078\003\115\000\237\255\026\004\117\000\236\255\022\006\118\000\235\255\117\000\232\255\147\008\231\255\044\007\016\005\004\000\230\255\007\000\009\001\045\001\008\000\005\000\230\255\214\008\249\008\030\009\065\009\218\255\214\255\215\255\216\255\212\255\100\009\205\255\206\255\207\255\202\255\199\255\135\009\195\255\197\255\170\009\205\009\014\001\252\255\253\255\006\000\254\255\127\000\255\255\062\002\251\255\252\255\009\000\253\255\254\255\135\000\255\255\135\000\182\000\012\000\016\000\225\000\017\000\224\000\013\000\255\255";
  Lexing.lex_backtrk = 
   "\255\255\255\255\255\255\071\000\068\000\067\000\062\000\065\000\255\255\057\000\054\000\052\000\255\255\047\000\046\000\044\000\042\000\038\000\036\000\063\000\255\255\255\255\255\255\027\000\026\000\033\000\031\000\030\000\255\255\010\000\010\000\009\000\008\000\005\000\003\000\002\000\001\000\000\000\255\255\066\000\255\255\255\255\255\255\006\000\255\255\255\255\255\255\255\255\255\255\011\000\255\255\255\255\255\255\010\000\010\000\010\000\011\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\021\000\021\000\021\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\022\000\255\255\070\000\255\255\255\255\255\255\025\000\255\255\255\255\255\255\255\255\255\255\025\000\255\255\028\000\069\000\064\000\035\000\255\255\255\255\255\255\255\255\255\255\045\000\255\255\255\255\255\255\255\255\255\255\055\000\255\255\255\255\065\000\061\000\255\255\255\255\255\255\001\000\255\255\003\000\255\255\255\255\255\255\255\255\002\000\255\255\255\255\004\000\255\255\002\000\255\255\255\255\001\000\255\255\255\255\255\255\255\255\255\255";
  Lexing.lex_default = 
   "\001\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\255\255\255\255\255\255\255\255\059\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\000\000\255\255\255\255\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\064\000\255\255\255\255\255\255\000\000\000\000\000\000\255\255\255\255\255\255\000\000\255\255\255\255\000\000\255\255\255\255\000\000\255\255\000\000\255\255\000\000\083\000\255\255\255\255\000\000\083\000\084\000\083\000\086\000\255\255\000\000\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\255\255\255\255\110\000\000\000\000\000\255\255\000\000\255\255\000\000\117\000\000\000\000\000\255\255\000\000\000\000\255\255\000\000\255\255\255\255\126\000\129\000\255\255\129\000\255\255\255\255\000\000";
  Lexing.lex_trans = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\036\000\038\000\038\000\036\000\037\000\082\000\088\000\113\000\082\000\088\000\120\000\081\000\087\000\127\000\132\000\000\000\000\000\128\000\128\000\000\000\000\000\000\000\000\000\036\000\007\000\028\000\024\000\005\000\003\000\023\000\027\000\026\000\021\000\025\000\006\000\020\000\019\000\018\000\003\000\030\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\017\000\016\000\015\000\014\000\009\000\033\000\004\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\013\000\102\000\012\000\004\000\035\000\022\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\011\000\010\000\008\000\034\000\100\000\097\000\099\000\096\000\093\000\080\000\095\000\094\000\075\000\036\000\063\000\057\000\036\000\057\000\055\000\055\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\062\000\068\000\080\000\071\000\074\000\076\000\036\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\115\000\123\000\125\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\101\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\126\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\061\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\002\000\003\000\130\000\131\000\003\000\003\000\003\000\255\255\255\255\000\000\003\000\003\000\255\255\003\000\003\000\003\000\255\255\255\255\000\000\082\000\062\000\000\000\081\000\000\000\113\000\000\000\003\000\112\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\004\000\000\000\000\000\004\000\004\000\004\000\000\000\086\000\000\000\004\000\004\000\000\000\004\000\004\000\004\000\000\000\000\000\000\000\085\000\082\000\114\000\061\000\081\000\000\000\060\000\004\000\003\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\085\000\000\000\084\000\005\000\005\000\000\000\005\000\005\000\005\000\255\255\000\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\000\000\005\000\004\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\090\000\000\000\000\000\090\000\090\000\090\000\000\000\000\000\000\000\090\000\090\000\000\000\090\000\090\000\090\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\000\000\090\000\005\000\090\000\090\000\090\000\090\000\090\000\000\000\058\000\000\000\107\000\000\000\000\000\107\000\107\000\107\000\000\000\000\000\000\000\107\000\107\000\000\000\107\000\107\000\107\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\107\000\090\000\107\000\108\000\107\000\107\000\107\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\090\000\000\000\090\000\000\000\005\000\107\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\107\000\000\000\107\000\000\000\106\000\005\000\005\000\000\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\255\255\000\000\005\000\105\000\005\000\111\000\000\000\000\000\103\000\005\000\005\000\000\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\098\000\005\000\005\000\000\000\255\255\000\000\255\255\104\000\000\000\005\000\000\000\000\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\090\000\000\000\000\000\090\000\090\000\090\000\000\000\000\000\120\000\090\000\090\000\119\000\090\000\091\000\090\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\090\000\005\000\090\000\090\000\092\000\090\000\090\000\121\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\089\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\005\000\090\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\003\000\000\000\000\000\003\000\003\000\003\000\000\000\000\000\078\000\077\000\003\000\000\000\003\000\003\000\003\000\000\000\000\000\055\000\055\000\000\000\122\000\090\000\000\000\090\000\000\000\003\000\005\000\003\000\003\000\003\000\003\000\003\000\049\000\000\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\000\000\046\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\048\000\005\000\000\000\005\000\000\000\000\000\003\000\046\000\000\000\055\000\049\000\000\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\047\000\000\000\045\000\000\000\029\000\000\000\000\000\000\000\050\000\000\000\048\000\048\000\000\000\000\000\003\000\000\000\003\000\047\000\046\000\045\000\000\000\051\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\052\000\000\000\000\000\000\000\000\000\000\000\000\000\029\000\000\000\000\000\050\000\000\000\000\000\048\000\000\000\000\000\000\000\000\000\000\000\000\000\047\000\000\000\045\000\051\000\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\052\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\000\000\118\000\000\000\000\000\031\000\000\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\000\000\048\000\000\000\000\000\000\000\000\000\000\000\053\000\053\000\053\000\053\000\053\000\053\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\000\000\000\000\000\000\000\000\049\000\000\000\000\000\000\000\000\000\000\000\048\000\000\000\000\000\000\000\000\000\000\000\053\000\053\000\053\000\053\000\053\000\053\000\000\000\000\000\000\000\000\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\000\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\032\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\053\000\053\000\053\000\053\000\053\000\053\000\000\000\000\000\000\000\000\000\000\000\046\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\053\000\000\000\053\000\053\000\053\000\053\000\053\000\053\000\000\000\000\000\000\000\000\000\000\000\047\000\000\000\045\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\039\000\000\000\000\000\039\000\039\000\039\000\000\000\000\000\000\000\039\000\039\000\000\000\039\000\039\000\039\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\039\000\000\000\039\000\039\000\039\000\043\000\039\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\039\000\042\000\000\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\056\000\039\000\039\000\039\000\000\000\039\000\039\000\039\000\000\000\000\000\000\000\039\000\039\000\080\000\039\000\039\000\039\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\039\000\000\000\039\000\039\000\039\000\039\000\039\000\000\000\000\000\080\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\000\000\039\000\040\000\000\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\000\000\039\000\000\000\039\000\000\000\000\000\000\000\000\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\000\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\000\072\000\072\000\072\000\072\000\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\000\072\000\072\000\072\000\072\000\072\000\000\000\000\000\000\000\000\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\032\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\000\000\000\000\000\000\000\000\000\000\000\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\000\000\000\000\000\000\000\000\046\000\000\000\000\000\073\000\073\000\073\000\073\000\073\000\073\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\054\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\047\000\000\000\045\000\073\000\073\000\073\000\073\000\073\000\073\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\039\000\000\000\000\000\039\000\039\000\039\000\000\000\000\000\000\000\039\000\039\000\000\000\039\000\039\000\039\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\039\000\000\000\039\000\039\000\039\000\039\000\039\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\041\000\000\000\000\000\000\000\000\000\000\000\039\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\000\000\000\000\000\000\039\000\040\000\039\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\085\000\082\000\000\000\000\000\081\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\085\000\000\000\084\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\000\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\042\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\044\000\000\000\000\000\000\000\000\000\000\000\000\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\000\000\000\000\000\000\000\000\042\000\000\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\000\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\000\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\039\000\000\000\000\000\039\000\039\000\039\000\000\000\000\000\000\000\039\000\039\000\000\000\039\000\039\000\039\000\000\000\067\000\000\000\067\000\000\000\000\000\000\000\000\000\067\000\000\000\039\000\000\000\039\000\039\000\039\000\039\000\039\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\077\000\000\000\000\000\077\000\077\000\077\000\000\000\000\000\000\000\077\000\077\000\000\000\077\000\077\000\077\000\000\000\000\000\000\000\000\000\039\000\000\000\000\000\000\000\000\000\000\000\077\000\000\000\077\000\077\000\077\000\077\000\077\000\000\000\000\000\067\000\000\000\000\000\000\000\000\000\000\000\067\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\039\000\000\000\039\000\067\000\000\000\000\000\000\000\067\000\000\000\067\000\000\000\000\000\077\000\065\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\077\000\005\000\077\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\090\000\000\000\000\000\090\000\090\000\090\000\000\000\000\000\000\000\090\000\090\000\000\000\090\000\090\000\090\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\090\000\005\000\090\000\090\000\090\000\090\000\090\000\000\000\000\000\000\000\000\000\000\000\090\000\000\000\000\000\090\000\090\000\090\000\000\000\000\000\000\000\090\000\090\000\000\000\090\000\090\000\090\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\000\000\090\000\090\000\000\000\090\000\090\000\090\000\090\000\090\000\000\000\000\000\000\000\090\000\000\000\000\000\090\000\090\000\090\000\000\000\000\000\000\000\090\000\090\000\000\000\090\000\090\000\090\000\000\000\000\000\000\000\000\000\090\000\000\000\090\000\000\000\000\000\255\255\090\000\090\000\090\000\090\000\090\000\090\000\090\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\090\000\000\000\090\000\000\000\005\000\090\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\090\000\000\000\090\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\107\000\000\000\000\000\107\000\107\000\107\000\000\000\000\000\000\000\107\000\107\000\000\000\107\000\107\000\107\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\107\000\005\000\107\000\107\000\107\000\107\000\107\000\000\000\000\000\000\000\107\000\000\000\000\000\107\000\107\000\107\000\000\000\000\000\000\000\107\000\107\000\000\000\107\000\107\000\107\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\107\000\000\000\107\000\000\000\000\000\107\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\107\000\000\000\107\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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\037\000\000\000\000\000\081\000\087\000\112\000\083\000\086\000\119\000\083\000\086\000\126\000\131\000\255\255\255\255\127\000\129\000\255\255\255\255\255\255\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\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\016\000\013\000\017\000\018\000\024\000\017\000\017\000\026\000\036\000\059\000\048\000\036\000\048\000\050\000\050\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\061\000\067\000\024\000\070\000\073\000\075\000\036\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\114\000\122\000\124\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\125\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\060\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\128\000\130\000\003\000\003\000\003\000\083\000\086\000\255\255\003\000\003\000\126\000\003\000\003\000\003\000\127\000\129\000\255\255\084\000\060\000\255\255\084\000\255\255\109\000\255\255\003\000\109\000\003\000\003\000\003\000\003\000\003\000\255\255\255\255\255\255\004\000\255\255\255\255\004\000\004\000\004\000\255\255\084\000\255\255\004\000\004\000\255\255\004\000\004\000\004\000\255\255\255\255\255\255\085\000\085\000\109\000\027\000\085\000\255\255\027\000\004\000\003\000\004\000\004\000\004\000\004\000\004\000\255\255\255\255\255\255\005\000\255\255\255\255\005\000\005\000\005\000\085\000\255\255\085\000\005\000\005\000\255\255\005\000\005\000\005\000\027\000\255\255\255\255\255\255\255\255\255\255\003\000\255\255\003\000\255\255\005\000\004\000\005\000\005\000\005\000\005\000\005\000\255\255\255\255\255\255\006\000\255\255\255\255\006\000\006\000\006\000\255\255\255\255\255\255\006\000\006\000\255\255\006\000\006\000\006\000\255\255\255\255\255\255\255\255\255\255\255\255\004\000\255\255\004\000\255\255\006\000\005\000\006\000\006\000\006\000\006\000\006\000\255\255\027\000\255\255\007\000\255\255\255\255\007\000\007\000\007\000\255\255\255\255\255\255\007\000\007\000\255\255\007\000\007\000\007\000\255\255\255\255\255\255\255\255\255\255\255\255\005\000\255\255\005\000\255\255\007\000\006\000\007\000\007\000\007\000\007\000\007\000\255\255\255\255\255\255\009\000\255\255\255\255\009\000\009\000\009\000\255\255\255\255\255\255\009\000\009\000\255\255\009\000\009\000\009\000\255\255\255\255\255\255\255\255\255\255\255\255\006\000\255\255\006\000\255\255\009\000\007\000\009\000\009\000\009\000\009\000\009\000\255\255\255\255\255\255\255\255\255\255\010\000\255\255\255\255\010\000\010\000\010\000\255\255\255\255\255\255\010\000\010\000\255\255\010\000\010\000\010\000\255\255\255\255\255\255\255\255\007\000\255\255\007\000\255\255\009\000\009\000\010\000\255\255\010\000\010\000\010\000\010\000\010\000\255\255\255\255\255\255\255\255\255\255\014\000\255\255\255\255\014\000\014\000\014\000\255\255\255\255\255\255\014\000\014\000\255\255\014\000\014\000\014\000\084\000\255\255\009\000\009\000\009\000\109\000\255\255\255\255\010\000\010\000\014\000\255\255\014\000\014\000\014\000\014\000\014\000\255\255\255\255\255\255\015\000\255\255\255\255\015\000\015\000\015\000\255\255\255\255\255\255\015\000\015\000\255\255\015\000\015\000\015\000\255\255\085\000\255\255\027\000\010\000\255\255\010\000\255\255\255\255\255\255\015\000\014\000\015\000\015\000\015\000\015\000\015\000\255\255\255\255\255\255\019\000\255\255\255\255\019\000\019\000\019\000\255\255\255\255\116\000\019\000\019\000\116\000\019\000\019\000\019\000\255\255\255\255\255\255\255\255\255\255\255\255\014\000\255\255\014\000\255\255\019\000\015\000\019\000\019\000\019\000\019\000\019\000\116\000\255\255\255\255\023\000\255\255\255\255\023\000\023\000\023\000\255\255\255\255\255\255\023\000\023\000\255\255\023\000\023\000\023\000\255\255\255\255\255\255\255\255\255\255\255\255\015\000\255\255\015\000\255\255\023\000\019\000\023\000\023\000\023\000\023\000\023\000\255\255\255\255\255\255\025\000\255\255\255\255\025\000\025\000\025\000\255\255\255\255\025\000\025\000\025\000\255\255\025\000\025\000\025\000\255\255\255\255\055\000\055\000\255\255\116\000\019\000\255\255\019\000\255\255\025\000\023\000\025\000\025\000\025\000\025\000\025\000\029\000\255\255\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\255\255\055\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\029\000\023\000\255\255\023\000\255\255\255\255\025\000\029\000\255\255\055\000\030\000\255\255\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\055\000\255\255\055\000\255\255\029\000\255\255\255\255\255\255\030\000\255\255\029\000\030\000\255\255\255\255\025\000\255\255\025\000\029\000\030\000\029\000\255\255\030\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\030\000\255\255\255\255\255\255\255\255\255\255\255\255\030\000\255\255\255\255\030\000\255\255\255\255\030\000\255\255\255\255\255\255\255\255\255\255\255\255\030\000\255\255\030\000\030\000\031\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\030\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\255\255\116\000\255\255\255\255\031\000\255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\255\255\049\000\255\255\255\255\255\255\255\255\255\255\052\000\052\000\052\000\052\000\052\000\052\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\255\255\255\255\255\255\255\255\049\000\255\255\255\255\255\255\255\255\255\255\049\000\255\255\255\255\255\255\255\255\255\255\052\000\052\000\052\000\052\000\052\000\052\000\255\255\255\255\255\255\255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\032\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\255\255\255\255\255\255\255\255\032\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\053\000\053\000\053\000\053\000\053\000\053\000\255\255\255\255\255\255\255\255\255\255\053\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\053\000\255\255\053\000\053\000\053\000\053\000\053\000\053\000\255\255\255\255\255\255\255\255\255\255\053\000\255\255\053\000\255\255\255\255\255\255\255\255\255\255\255\255\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\033\000\255\255\255\255\033\000\033\000\033\000\255\255\255\255\255\255\033\000\033\000\255\255\033\000\033\000\033\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\033\000\255\255\033\000\033\000\033\000\033\000\033\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\033\000\033\000\255\255\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\056\000\033\000\034\000\033\000\255\255\034\000\034\000\034\000\255\255\255\255\255\255\034\000\034\000\080\000\034\000\034\000\034\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\034\000\255\255\034\000\034\000\034\000\034\000\034\000\255\255\255\255\080\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\080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\255\255\034\000\034\000\255\255\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\255\255\034\000\255\255\034\000\255\255\255\255\255\255\255\255\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\255\255\033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\065\000\065\000\065\000\065\000\065\000\065\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\065\000\065\000\065\000\065\000\065\000\065\000\255\255\255\255\255\255\255\255\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\035\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\255\255\255\255\255\255\255\255\035\000\255\255\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\255\255\255\255\255\255\255\255\255\255\255\255\072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\255\255\255\255\255\255\255\255\054\000\255\255\255\255\072\000\072\000\072\000\072\000\072\000\072\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\054\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\054\000\255\255\054\000\072\000\072\000\072\000\072\000\072\000\072\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\255\255\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\255\255\035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\039\000\255\255\255\255\039\000\039\000\039\000\255\255\255\255\255\255\039\000\039\000\255\255\039\000\039\000\039\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\039\000\255\255\039\000\039\000\039\000\039\000\039\000\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\040\000\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\039\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\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\039\000\040\000\039\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\079\000\079\000\255\255\255\255\079\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\079\000\255\255\079\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\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\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\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\255\255\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\042\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\255\255\255\255\255\255\255\255\255\255\255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\255\255\255\255\255\255\255\255\042\000\255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\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\079\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\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\255\255\042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\043\000\255\255\255\255\043\000\043\000\043\000\255\255\255\255\255\255\043\000\043\000\255\255\043\000\043\000\043\000\255\255\058\000\255\255\058\000\255\255\255\255\255\255\255\255\058\000\255\255\043\000\255\255\043\000\043\000\043\000\043\000\043\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\077\000\255\255\255\255\077\000\077\000\077\000\255\255\255\255\255\255\077\000\077\000\255\255\077\000\077\000\077\000\255\255\255\255\255\255\255\255\043\000\255\255\255\255\255\255\255\255\255\255\077\000\255\255\077\000\077\000\077\000\077\000\077\000\255\255\255\255\058\000\255\255\255\255\255\255\255\255\255\255\058\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\043\000\255\255\043\000\058\000\255\255\255\255\255\255\058\000\255\255\058\000\255\255\255\255\077\000\058\000\255\255\255\255\255\255\255\255\089\000\255\255\255\255\089\000\089\000\089\000\255\255\255\255\255\255\089\000\089\000\255\255\089\000\089\000\089\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\077\000\089\000\077\000\089\000\089\000\089\000\089\000\089\000\255\255\255\255\255\255\090\000\255\255\255\255\090\000\090\000\090\000\255\255\255\255\255\255\090\000\090\000\255\255\090\000\090\000\090\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\090\000\089\000\090\000\090\000\090\000\090\000\090\000\255\255\255\255\255\255\255\255\255\255\091\000\255\255\255\255\091\000\091\000\091\000\255\255\255\255\255\255\091\000\091\000\255\255\091\000\091\000\091\000\255\255\255\255\255\255\255\255\089\000\255\255\089\000\255\255\255\255\090\000\091\000\255\255\091\000\091\000\091\000\091\000\091\000\255\255\255\255\255\255\092\000\255\255\255\255\092\000\092\000\092\000\255\255\255\255\255\255\092\000\092\000\255\255\092\000\092\000\092\000\255\255\255\255\255\255\255\255\090\000\255\255\090\000\255\255\255\255\058\000\092\000\091\000\092\000\092\000\092\000\092\000\092\000\255\255\255\255\255\255\098\000\255\255\255\255\098\000\098\000\098\000\255\255\255\255\255\255\098\000\098\000\255\255\098\000\098\000\098\000\255\255\255\255\255\255\255\255\255\255\255\255\091\000\255\255\091\000\255\255\098\000\092\000\098\000\098\000\098\000\098\000\098\000\255\255\255\255\255\255\104\000\255\255\255\255\104\000\104\000\104\000\255\255\255\255\255\255\104\000\104\000\255\255\104\000\104\000\104\000\255\255\255\255\255\255\255\255\255\255\255\255\092\000\255\255\092\000\255\255\104\000\098\000\104\000\104\000\104\000\104\000\104\000\255\255\255\255\255\255\107\000\255\255\255\255\107\000\107\000\107\000\255\255\255\255\255\255\107\000\107\000\255\255\107\000\107\000\107\000\255\255\255\255\255\255\255\255\255\255\255\255\098\000\255\255\098\000\255\255\107\000\104\000\107\000\107\000\107\000\107\000\107\000\255\255\255\255\255\255\108\000\255\255\255\255\108\000\108\000\108\000\255\255\255\255\255\255\108\000\108\000\255\255\108\000\108\000\108\000\255\255\255\255\255\255\255\255\255\255\255\255\104\000\255\255\104\000\255\255\108\000\107\000\108\000\108\000\108\000\108\000\108\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\107\000\255\255\107\000\255\255\255\255\108\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\108\000\255\255\108\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\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\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 = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\036\000\000\000\012\000\000\000\000\000\002\000\000\000\000\000\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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_backtrk_code = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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_default_code = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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_trans_code = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\001\000\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\001\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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_code = 
   "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\024\000\084\000\255\255\255\255\084\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\024\000\255\255\084\000\000\000\085\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\079\000\080\000\255\255\255\255\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\080\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\080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\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\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\084\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";
  Lexing.lex_code = 
   "\255\004\255\255\005\255\255\007\255\006\255\255\003\255\000\004\001\005\255\007\255\255\006\255\007\255\255\000\004\001\005\003\006\002\007\255";
}

let rec token lexbuf =
  lexbuf.Lexing.lex_mem <- Array.create 8 (-1) ;   __ocaml_lex_token_rec lexbuf 0
and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
  match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 935 "editor/ed_ocaml_lexer.mll"
      ( update_loc lexbuf None 1 false 0;
        (* increment only if this is not an empty line *)
        if (not !next_token_is_first) then
          if !next_line_is_more_indented > 0 &&
            (!cur_indent <= last_block_inner_indent ())
          then
            cur_indent := !cur_indent + !cst_indent.ind_newline
          else
            incr next_line_is_more_indented;
        if_first_token_on_line 0;
        next_token_is_first := true;
        token lexbuf
      )
# 1791 "editor/ed_ocaml_lexer.ml"

  | 1 ->
# 949 "editor/ed_ocaml_lexer.mll"
      ( token lexbuf )
# 1796 "editor/ed_ocaml_lexer.ml"

  | 2 ->
# 951 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line !cur_indent; token lexbuf )
# 1801 "editor/ed_ocaml_lexer.ml"

  | 3 ->
# 952 "editor/ed_ocaml_lexer.mll"
        ( if_first_token_on_line !cur_indent; token lexbuf )
# 1806 "editor/ed_ocaml_lexer.ml"

  | 4 ->
# 954 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line !cur_indent;
        let s = Lexing.lexeme lexbuf in
        let name = String.sub s 1 (String.length s - 2) in
        if Hashtbl.mem keyword_table name then
          raise (Error(Keyword_as_label name, curr_loc lexbuf));
        token lexbuf )
# 1816 "editor/ed_ocaml_lexer.ml"

  | 5 ->
# 960 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 1821 "editor/ed_ocaml_lexer.ml"

  | 6 ->
# 961 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 1826 "editor/ed_ocaml_lexer.ml"

  | 7 ->
# 963 "editor/ed_ocaml_lexer.mll"
      (
        let s = Lexing.lexeme lexbuf in
        let name = String.sub s 1 (String.length s - 2) in
        if Hashtbl.mem keyword_table name then
          raise (Error(Keyword_as_label name, curr_loc lexbuf));
        if_first_token_on_line !cur_indent;
        token lexbuf )
# 1837 "editor/ed_ocaml_lexer.ml"

  | 8 ->
# 971 "editor/ed_ocaml_lexer.mll"
      (
        let s = Lexing.lexeme lexbuf in
        try
          let kw = Hashtbl.find keyword_table s in
          on_keyword lexbuf kw;
          token lexbuf
        with Not_found ->
          if_first_token_on_line !cur_indent;
          token lexbuf
      )
# 1851 "editor/ed_ocaml_lexer.ml"

  | 9 ->
# 982 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf)
# 1858 "editor/ed_ocaml_lexer.ml"

  | 10 ->
# 986 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1866 "editor/ed_ocaml_lexer.ml"

  | 11 ->
# 991 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1873 "editor/ed_ocaml_lexer.ml"

  | 12 ->
# 995 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1881 "editor/ed_ocaml_lexer.ml"

  | 13 ->
# 1000 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1889 "editor/ed_ocaml_lexer.ml"

  | 14 ->
# 1005 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1897 "editor/ed_ocaml_lexer.ml"

  | 15 ->
# 1010 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        string lexbuf;
        token lexbuf
      )
# 1906 "editor/ed_ocaml_lexer.ml"

  | 16 ->
# 1016 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        next_token_is_first := true;
        if_first_token_on_line 0;
        update_loc lexbuf None 1 false 1;
        token lexbuf
      )
# 1917 "editor/ed_ocaml_lexer.ml"

  | 17 ->
# 1024 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1925 "editor/ed_ocaml_lexer.ml"

  | 18 ->
# 1029 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1933 "editor/ed_ocaml_lexer.ml"

  | 19 ->
# 1034 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1941 "editor/ed_ocaml_lexer.ml"

  | 20 ->
# 1039 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1949 "editor/ed_ocaml_lexer.ml"

  | 21 ->
# 1044 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        let l = Lexing.lexeme lexbuf in
        let esc = String.sub l 1 (String.length l - 1) in
        raise (Error(Illegal_escape esc, curr_loc lexbuf))
      )
# 1959 "editor/ed_ocaml_lexer.ml"

  | 22 ->
# 1051 "editor/ed_ocaml_lexer.mll"
      (
        begin_comment_indentation := (!cur_indent, !next_line_is_more_indented);
        if_first_token_on_line !cur_indent;
        comment lexbuf;
        token lexbuf )
# 1968 "editor/ed_ocaml_lexer.ml"

  | 23 ->
# 1057 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        comment lexbuf;
        token lexbuf
      )
# 1977 "editor/ed_ocaml_lexer.ml"

  | 24 ->
# 1063 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        let curpos = lexbuf.lex_curr_p in
        lexbuf.lex_curr_p <- { curpos with pos_cnum = curpos.pos_cnum - 1 };
        token lexbuf
      )
# 1987 "editor/ed_ocaml_lexer.ml"

  | 25 ->
let
# 1069 "editor/ed_ocaml_lexer.mll"
                                   num
# 1993 "editor/ed_ocaml_lexer.ml"
Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_mem.(1)
and
# 1070 "editor/ed_ocaml_lexer.mll"
                                           name
# 1998 "editor/ed_ocaml_lexer.ml"
Lexing.sub_lexeme_opt lexbuf lexbuf.Lexing.lex_mem.(3) lexbuf.Lexing.lex_mem.(2) in
# 1072 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line 0;
        update_loc lexbuf name (int_of_string num) true 0;
        token lexbuf
      )
# 2006 "editor/ed_ocaml_lexer.ml"

  | 26 ->
# 1077 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2011 "editor/ed_ocaml_lexer.ml"

  | 27 ->
# 1078 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2016 "editor/ed_ocaml_lexer.ml"

  | 28 ->
# 1079 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2021 "editor/ed_ocaml_lexer.ml"

  | 29 ->
# 1080 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2026 "editor/ed_ocaml_lexer.ml"

  | 30 ->
# 1081 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2031 "editor/ed_ocaml_lexer.ml"

  | 31 ->
# 1082 "editor/ed_ocaml_lexer.mll"
         (
           on_par_open LPAREN lexbuf;
           token lexbuf
         )
# 2039 "editor/ed_ocaml_lexer.ml"

  | 32 ->
# 1086 "editor/ed_ocaml_lexer.mll"
         (
           on_par_close lexbuf RPAREN ")";
           token lexbuf )
# 2046 "editor/ed_ocaml_lexer.ml"

  | 33 ->
# 1089 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2052 "editor/ed_ocaml_lexer.ml"

  | 34 ->
# 1091 "editor/ed_ocaml_lexer.mll"
         ( on_keyword lexbuf COMMA;
           token lexbuf )
# 2058 "editor/ed_ocaml_lexer.ml"

  | 35 ->
# 1093 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           on_keyword lexbuf MINUSGREATER;
           token lexbuf )
# 2065 "editor/ed_ocaml_lexer.ml"

  | 36 ->
# 1096 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2071 "editor/ed_ocaml_lexer.ml"

  | 37 ->
# 1098 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2077 "editor/ed_ocaml_lexer.ml"

  | 38 ->
# 1100 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2083 "editor/ed_ocaml_lexer.ml"

  | 39 ->
# 1102 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2089 "editor/ed_ocaml_lexer.ml"

  | 40 ->
# 1104 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2095 "editor/ed_ocaml_lexer.ml"

  | 41 ->
# 1106 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2101 "editor/ed_ocaml_lexer.ml"

  | 42 ->
# 1108 "editor/ed_ocaml_lexer.mll"
         ( on_keyword lexbuf SEMI;
           token lexbuf )
# 2107 "editor/ed_ocaml_lexer.ml"

  | 43 ->
# 1110 "editor/ed_ocaml_lexer.mll"
         (
           set_indent 0;
           if_first_token_on_line !cur_indent;
           token lexbuf )
# 2115 "editor/ed_ocaml_lexer.ml"

  | 44 ->
# 1114 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2121 "editor/ed_ocaml_lexer.ml"

  | 45 ->
# 1116 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2127 "editor/ed_ocaml_lexer.ml"

  | 46 ->
# 1118 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2133 "editor/ed_ocaml_lexer.ml"

  | 47 ->
# 1120 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACKET lexbuf;
           token lexbuf )
# 2139 "editor/ed_ocaml_lexer.ml"

  | 48 ->
# 1122 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACKETBAR lexbuf ;
           token lexbuf )
# 2145 "editor/ed_ocaml_lexer.ml"

  | 49 ->
# 1124 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACKETLESS lexbuf ;
           token lexbuf )
# 2151 "editor/ed_ocaml_lexer.ml"

  | 50 ->
# 1126 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACKETGREATER lexbuf;
           token lexbuf )
# 2157 "editor/ed_ocaml_lexer.ml"

  | 51 ->
# 1128 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf RBRACKET "]";
           token lexbuf )
# 2163 "editor/ed_ocaml_lexer.ml"

  | 52 ->
# 1130 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACE lexbuf ;
           token lexbuf )
# 2169 "editor/ed_ocaml_lexer.ml"

  | 53 ->
# 1132 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACELESS lexbuf ;
           token lexbuf )
# 2175 "editor/ed_ocaml_lexer.ml"

  | 54 ->
# 1134 "editor/ed_ocaml_lexer.mll"
         (
           on_keyword lexbuf BAR;
           token lexbuf )
# 2182 "editor/ed_ocaml_lexer.ml"

  | 55 ->
# 1137 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2188 "editor/ed_ocaml_lexer.ml"

  | 56 ->
# 1139 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf BARRBRACKET "|]";
           token lexbuf )
# 2194 "editor/ed_ocaml_lexer.ml"

  | 57 ->
# 1141 "editor/ed_ocaml_lexer.mll"
         ( token lexbuf )
# 2199 "editor/ed_ocaml_lexer.ml"

  | 58 ->
# 1142 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf GREATERRBRACKET ">]";
           token lexbuf )
# 2205 "editor/ed_ocaml_lexer.ml"

  | 59 ->
# 1144 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf RBRACE "}";
           token lexbuf )
# 2211 "editor/ed_ocaml_lexer.ml"

  | 60 ->
# 1146 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf GREATERRBRACE ">}";
           token lexbuf )
# 2217 "editor/ed_ocaml_lexer.ml"

  | 61 ->
# 1148 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2223 "editor/ed_ocaml_lexer.ml"

  | 62 ->
# 1150 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2229 "editor/ed_ocaml_lexer.ml"

  | 63 ->
# 1152 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2235 "editor/ed_ocaml_lexer.ml"

  | 64 ->
# 1154 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2241 "editor/ed_ocaml_lexer.ml"

  | 65 ->
# 1158 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2247 "editor/ed_ocaml_lexer.ml"

  | 66 ->
# 1161 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2253 "editor/ed_ocaml_lexer.ml"

  | 67 ->
# 1164 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2259 "editor/ed_ocaml_lexer.ml"

  | 68 ->
# 1167 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2265 "editor/ed_ocaml_lexer.ml"

  | 69 ->
# 1170 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2271 "editor/ed_ocaml_lexer.ml"

  | 70 ->
# 1173 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2277 "editor/ed_ocaml_lexer.ml"

  | 71 ->
# 1176 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2283 "editor/ed_ocaml_lexer.ml"

  | 72 ->
# 1178 "editor/ed_ocaml_lexer.mll"
        ( EOF )
# 2288 "editor/ed_ocaml_lexer.ml"

  | 73 ->
# 1180 "editor/ed_ocaml_lexer.mll"
      ( raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0),
                     curr_loc lexbuf))
      )
# 2295 "editor/ed_ocaml_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state

and comment lexbuf =
    __ocaml_lex_comment_rec lexbuf 109
and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 1186 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        let indent, next_indented = !begin_comment_indentation in
        cur_indent := indent;
        next_line_is_more_indented := next_indented - 1
          (* usually, non-debug comments end a line *)
      )
# 2312 "editor/ed_ocaml_lexer.ml"

  | 1 ->
# 1194 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line 0;
        next_token_is_first := true;
        update_loc lexbuf None 1 false 1;
        comment lexbuf
      )
# 2322 "editor/ed_ocaml_lexer.ml"

  | 2 ->
# 1201 "editor/ed_ocaml_lexer.mll"
      ( raise (Error (Unterminated_comment, curr_loc lexbuf)) )
# 2327 "editor/ed_ocaml_lexer.ml"

  | 3 ->
# 1203 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line (!cur_indent + !cst_indent.ind_comment);
        comment lexbuf )
# 2334 "editor/ed_ocaml_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec lexbuf __ocaml_lex_state

and string lexbuf =
    __ocaml_lex_string_rec lexbuf 116
and __ocaml_lex_string_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 1209 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line_set_none () ;
        string lexbuf
      )
# 2347 "editor/ed_ocaml_lexer.ml"

  | 1 ->
# 1213 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line_set_none () )
# 2352 "editor/ed_ocaml_lexer.ml"

  | 2 ->
# 1215 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line_set_none () ;
        next_token_is_first := true;
        update_loc lexbuf None 1 false 1;
        string lexbuf
      )
# 2362 "editor/ed_ocaml_lexer.ml"

  | 3 ->
# 1222 "editor/ed_ocaml_lexer.mll"
      ( raise (Error (Unterminated_string, curr_loc lexbuf)) )
# 2367 "editor/ed_ocaml_lexer.ml"

  | 4 ->
# 1224 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line_set_none ();
        string lexbuf )
# 2374 "editor/ed_ocaml_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_string_rec lexbuf __ocaml_lex_state

and skip_sharp_bang lexbuf =
    __ocaml_lex_skip_sharp_bang_rec lexbuf 124
and __ocaml_lex_skip_sharp_bang_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 1230 "editor/ed_ocaml_lexer.mll"
       ( update_loc lexbuf None 3 false 0 )
# 2385 "editor/ed_ocaml_lexer.ml"

  | 1 ->
# 1232 "editor/ed_ocaml_lexer.mll"
       ( update_loc lexbuf None 1 false 0 )
# 2390 "editor/ed_ocaml_lexer.ml"

  | 2 ->
# 1233 "editor/ed_ocaml_lexer.mll"
       ( () )
# 2395 "editor/ed_ocaml_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_skip_sharp_bang_rec lexbuf __ocaml_lex_state

;;

# 1235 "editor/ed_ocaml_lexer.mll"
 
let get_lines_indentation ?(indent_spec=default_indent) s =
  let lexbuf = Lexing.from_string s in
  blocks := [];
  line_indentations := [];
  next_token_is_first := true;
  set_indent 0;
  cst_indent := indent_spec;
  try ignore(token lexbuf);
      `Success (List.rev !line_indentations);
  with Error (e,loc) -> `Failure (e,loc,(List.rev !line_indentations))


# 2415 "editor/ed_ocaml_lexer.ml"