# 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
| 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
;;
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
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;
"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
let char_for_backslash = function
| 'n' -> '\010'
| 'r' -> '\013'
| 'b' -> '\008'
| 't' -> '\009'
| c -> c
let char_for_decimal_code lexbuf i =
'x'
let char_for_hexadecimal_code lexbuf i =
'x'
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
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;
}
;;
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
;;
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
let line_indentations = ref ([] : int option list)
let next_token_is_first = ref true
let next_line_is_more_indented = ref 0
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 ->
pop tokens s lexbuf
| _ ->
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 -> [LBRACKET; LBRACKETLESS; LBRACKETGREATER]
| 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;
push_nl_info ();
push token !cur_indent cst;
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));
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 ->
(
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 ->
blocks := q;
on_keyword lexbuf BAR
| _ ->
if_first_token_on_line !cur_indent
)
| (BEGIN | STRUCT | SIG | OBJECT) as 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 | INCLUDE) as 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 ->
(
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 | EXTERNAL) as 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
(
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;
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 | METHOD) as 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 ->
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 ->
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 | TRY) as 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;
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,_,_) :: _ ->
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&\001I\001l\001\196\255\143\001\180\001 \000\204\255C\000\217\001\252\001E\000H\000U\000\031\002\221\255\223\255\226\255B\002{\000e\002]\000/\001\240\255x\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\007i\008\248\255\241\255\242\255\243\255_\000-\003]\000p\0007\003\253\003\008\006g\002\173\004\133\000z\008b\000\237\000r\000\239\255\238\255\234\255a\005N\003s\000\237\255\026\004u\000\236\255\022\006v\000\235\255u\000\232\255\147\008\231\255,\007\016\005\004\000\230\255\007\000\t\001-\001\008\000\005\000\230\255\214\008\249\008\030\tA\t\218\255\214\255\215\255\216\255\212\255d\t\205\255\206\255\207\255\202\255\199\255\135\t\195\255\197\255\170\t\205\t\014\001\252\255\253\255\006\000\254\255\127\000>\002\t\000\135\000\135\000\182\000\012\000\016\000\225\000\017\000\224\000\013\000";
Lexing.lex_backtrk =
"\255\255\255\255\255\255G\000D\000C\000>\000A\000\255\2559\0006\0004\000\255\255/\000.\000,\000*\000&\000$\000?\000\255\255\255\255\255\255\027\000\026\000!\000\031\000\030\000\255\255\n\000\n\000\t\000\008\000\005\000\003\000\002\000\001\000\000\000\255\255B\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\n\000\n\000\n\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\255F\000\255\255\255\255\255\255\025\000\255\255\255\255\255\255\255\255\255\255\025\000\255\255\028\000E\000@\000#\000\255\255\255\255\255\255\255\255\255\255-\000\255\255\255\255\255\255\255\255\255\2557\000\255\255\255\255A\000=\000\255\255\255\255\255\255\001\000\255\255\003\000\255\255\002\000\004\000\002\000\255\255\255\255\001\000\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;\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@\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\000S\000\255\255\255\255\000\000S\000T\000S\000V\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\255n\000\000\000\000\000\255\255\000\000\255\255)\000\255\255\255\255\255\255\255\255x\000{\000\255\255{\000\255\255\255\255";
Lexing.lex_trans =
"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000&\000&\000$\000%\000R\000X\000q\000R\000X\000o\000Q\000W\000y\000&\000\000\000\000\000z\000z\000\000\000\000\000\000\000\000\000$\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\t\000!\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\000f\000\012\000\004\000#\000\022\000 \000 \000 \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\n\000\008\000\"\000d\000a\000c\000`\000]\000P\000_\000^\000K\000$\000?\0009\000$\0009\0007\0007\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\000>\000D\000P\000G\000J\000L\000$\0006\0006\0006\0006\0006\0006\0006\0006\000&\000&\000w\000O\000O\000O\000O\000O\000O\000O\000O\000O\000O\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\000e\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\000x\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 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000=\000 \000 \000 \000 \000 \000 \000 \000 \000\002\000\003\000|\000}\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\000R\000>\000\000\000Q\000\000\000q\000\000\000\003\000p\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\000V\000\000\000\004\000\004\000\000\000\004\000\004\000\004\000\000\000\000\000\000\000U\000R\000r\000=\000Q\000\000\000<\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\000U\000\000\000T\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\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\000\000Z\000\005\000Z\000Z\000Z\000Z\000Z\000\000\000:\000\000\000k\000\000\000\000\000k\000k\000k\000\000\000\000\000\000\000k\000k\000\000\000k\000k\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000k\000Z\000k\000l\000k\000k\000k\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\000Z\000\000\000Z\000\000\000\005\000k\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\000k\000\000\000k\000\000\000j\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\000i\000\005\000o\000\000\000\000\000g\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\000b\000\005\000\005\000\000\000\255\255\000\000\255\255h\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\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000o\000Z\000Z\000t\000Z\000[\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000Z\000\005\000Z\000Z\000\\\000Z\000Z\000q\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000Y\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\000Z\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\000N\000M\000\003\000\000\000\003\000\003\000\003\000\000\000\000\0007\0007\000\000\000u\000Z\000\000\000Z\000\000\000\003\000\005\000\003\000\003\000\003\000\003\000\003\0001\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.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\005\000\000\000\000\000\003\000.\000\000\0007\0001\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\000-\000\000\000\029\000\000\000\000\000\000\0002\000\000\0000\0000\000\000\000\000\000\003\000\000\000\003\000/\000.\000-\000\000\0003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0004\000\000\000\000\000\000\000\000\000\000\000\000\000\029\000\000\000\000\0002\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000/\000\000\000-\0003\000\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0004\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\000n\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\0001\0001\0001\0001\0001\0001\0001\0001\0001\0001\0005\0005\0005\0005\0005\0005\0005\0005\0005\0005\000\000\0000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\0005\000E\000E\000E\000E\000E\000E\000E\000E\000E\000E\000\000\000\000\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\0005\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 \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\000\000\000\000\000\000\000\000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000\000\000\000\000\000\000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \0005\0005\0005\0005\0005\0005\0005\0005\0005\0005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\0005\000\000\000\000\000\000\000\000\000\000\000.\000F\000F\000F\000F\000F\000F\000F\000F\000F\000F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\0005\0005\0005\0005\0005\0005\000\000\000\000\000\000\000\000\000\000\000/\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000'\000\000\000\000\000'\000'\000'\000\000\000\000\000\000\000'\000'\000\000\000'\000'\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000'\000'\000'\000+\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\0008\000'\000'\000'\000\000\000'\000'\000'\000\000\000\000\000\000\000'\000'\000P\000'\000'\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000'\000'\000'\000'\000'\000\000\000\000\000P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000O\000O\000O\000O\000O\000O\000O\000O\000O\000O\000\000\000'\000(\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\000\000'\000\000\000'\000\000\000\000\000\000\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000H\000H\000H\000H\000H\000H\000H\000H\000H\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000H\000H\000H\000H\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000H\000H\000H\000H\000H\000\000\000\000\000\000\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000 \000(\000(\000(\000(\000(\000(\000(\000(\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000\000\000\000\000\000\000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \0006\0006\0006\0006\0006\0006\0006\0006\000\000\000\000\000\000\000\000\000\000\000\000\000I\000I\000I\000I\000I\000I\000I\000I\000I\000I\000\000\000\000\000\000\000\000\000.\000\000\000\000\000I\000I\000I\000I\000I\000I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000/\000\000\000-\000I\000I\000I\000I\000I\000I\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000'\000\000\000\000\000'\000'\000'\000\000\000\000\000\000\000'\000'\000\000\000'\000'\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000'\000'\000'\000'\000'\000\000\000\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000)\000\000\000\000\000\000\000\000\000\000\000'\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\000\000\000\000\000\000'\000(\000'\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000U\000R\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000U\000\000\000T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000O\000O\000O\000O\000O\000O\000O\000O\000O\000O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000*\000(\000(\000(\000(\000(\000(\000(\000(\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000,\000\000\000\000\000\000\000\000\000\000\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000\000\000\000\000\000\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000'\000\000\000\000\000'\000'\000'\000\000\000\000\000\000\000'\000'\000\000\000'\000'\000'\000\000\000C\000\000\000C\000\000\000\000\000\000\000\000\000C\000\000\000'\000\000\000'\000'\000'\000'\000'\000B\000B\000B\000B\000B\000B\000B\000B\000B\000B\000M\000\000\000\000\000M\000M\000M\000\000\000\000\000\000\000M\000M\000\000\000M\000M\000M\000\000\000\000\000\000\000\000\000'\000\000\000\000\000\000\000\000\000\000\000M\000\000\000M\000M\000M\000M\000M\000\000\000\000\000C\000\000\000\000\000\000\000\000\000\000\000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000'\000C\000\000\000\000\000\000\000C\000\000\000C\000\000\000\000\000M\000A\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\000M\000\005\000M\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Z\000\005\000Z\000Z\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000\000\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000Z\000\000\000Z\000\000\000\000\000\255\255Z\000Z\000Z\000Z\000Z\000Z\000Z\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\000Z\000\000\000Z\000\000\000\005\000Z\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\000Z\000\000\000Z\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000k\000\000\000\000\000k\000k\000k\000\000\000\000\000\000\000k\000k\000\000\000k\000k\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000k\000\005\000k\000k\000k\000k\000k\000\000\000\000\000\000\000k\000\000\000\000\000k\000k\000k\000\000\000\000\000\000\000k\000k\000\000\000k\000k\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000k\000k\000k\000k\000k\000k\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000k\000\000\000k\000\000\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000k\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\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%\000\000\000\000\000Q\000W\000p\000S\000V\000t\000S\000V\000x\000}\000\255\255\255\255y\000{\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$\000;\0000\000$\0000\0002\0002\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\000=\000C\000\024\000F\000I\000K\000$\0003\0003\0003\0003\0003\0003\0003\0003\000r\000u\000v\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\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\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000z\000|\000\003\000\003\000\003\000S\000V\000\255\255\003\000\003\000x\000\003\000\003\000\003\000y\000{\000\255\255T\000<\000\255\255T\000\255\255m\000\255\255\003\000m\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\255T\000\255\255\004\000\004\000\255\255\004\000\004\000\004\000\255\255\255\255\255\255U\000U\000m\000\027\000U\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\000U\000\255\255U\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\t\000\255\255\255\255\t\000\t\000\t\000\255\255\255\255\255\255\t\000\t\000\255\255\t\000\t\000\t\000\255\255\255\255\255\255\255\255\255\255\255\255\006\000\255\255\006\000\255\255\t\000\007\000\t\000\t\000\t\000\t\000\t\000\255\255\255\255\255\255\255\255\255\255\n\000\255\255\255\255\n\000\n\000\n\000\255\255\255\255\255\255\n\000\n\000\255\255\n\000\n\000\n\000\255\255\255\255\255\255\255\255\007\000\255\255\007\000\255\255\t\000\t\000\n\000\255\255\n\000\n\000\n\000\n\000\n\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\000T\000\255\255\t\000\t\000\t\000m\000\255\255\255\255\n\000\n\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\255U\000\255\255\027\000\n\000\255\255\n\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\255s\000\019\000\019\000s\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\000s\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\2557\0007\000\255\255s\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\2557\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\2557\000\030\000\255\255\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\0007\000\255\2557\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\255s\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\0001\0001\0001\0001\0001\0001\0001\0001\0001\0001\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\000\255\2551\000\255\255\255\255\255\255\255\255\255\2554\0004\0004\0004\0004\0004\000B\000B\000B\000B\000B\000B\000B\000B\000B\000B\000\255\255\255\255\255\255\255\2551\000\255\255\255\255\255\255\255\255\255\2551\000\255\255\255\255\255\255\255\255\255\2554\0004\0004\0004\0004\0004\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 \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\255\255\255\255\255\255\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\255\255\255\255\255\255\255\255 \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 \0005\0005\0005\0005\0005\0005\0005\0005\0005\0005\000\255\255\255\255\255\255\255\255\255\255\255\255\255\2555\0005\0005\0005\0005\0005\000\255\255\255\255\255\255\255\255\255\2555\000E\000E\000E\000E\000E\000E\000E\000E\000E\000E\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2555\000\255\2555\0005\0005\0005\0005\0005\000\255\255\255\255\255\255\255\255\255\2555\000\255\2555\000\255\255\255\255\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\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\255\255 \000 \000 \000 \000 \000 \000 \000 \000!\000\255\255\255\255!\000!\000!\000\255\255\255\255\255\255!\000!\000\255\255!\000!\000!\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255!\000\255\255!\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\255\2558\0008\0008\0008\0008\0008\0008\0008\0008\0008\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255!\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!\0008\000!\000\"\000!\000\255\255\"\000\"\000\"\000\255\255\255\255\255\255\"\000\"\000P\000\"\000\"\000\"\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\"\000\255\255\"\000\"\000\"\000\"\000\"\000\255\255\255\255P\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\255P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000\255\255\"\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\255\255\"\000\255\255\"\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\255\255!\000!\000!\000!\000!\000!\000!\000!\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255A\000A\000A\000A\000A\000A\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\255A\000A\000A\000A\000A\000A\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\255\255\255\255\255\255\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\255\255\255\255\255\255\255\255#\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#\0006\0006\0006\0006\0006\0006\0006\0006\000\255\255\255\255\255\255\255\255\255\255\255\255H\000H\000H\000H\000H\000H\000H\000H\000H\000H\000\255\255\255\255\255\255\255\2556\000\255\255\255\255H\000H\000H\000H\000H\000H\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2556\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2556\000\255\2556\000H\000H\000H\000H\000H\000H\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\255\255#\000#\000#\000#\000#\000#\000#\000#\000'\000\255\255\255\255'\000'\000'\000\255\255\255\255\255\255'\000'\000\255\255'\000'\000'\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255'\000\255\255'\000'\000'\000'\000'\000\255\255\255\255\255\255\255\255(\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\255\255\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\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(\000O\000O\000\255\255\255\255O\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\255O\000\255\255O\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\255O\000O\000O\000O\000O\000O\000O\000O\000O\000O\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(\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\255\255\255\255\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\255\255\255\255\255\255\255\255*\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\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255O\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*\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\255\255*\000*\000*\000*\000*\000*\000*\000*\000+\000\255\255\255\255+\000+\000+\000\255\255\255\255\255\255+\000+\000\255\255+\000+\000+\000\255\255:\000\255\255:\000\255\255\255\255\255\255\255\255:\000\255\255+\000\255\255+\000+\000+\000+\000+\000:\000:\000:\000:\000:\000:\000:\000:\000:\000:\000M\000\255\255\255\255M\000M\000M\000\255\255\255\255\255\255M\000M\000\255\255M\000M\000M\000\255\255\255\255\255\255\255\255+\000\255\255\255\255\255\255\255\255\255\255M\000\255\255M\000M\000M\000M\000M\000\255\255\255\255:\000\255\255\255\255\255\255\255\255\255\255:\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255+\000\255\255+\000:\000\255\255\255\255\255\255:\000\255\255:\000\255\255\255\255M\000:\000\255\255\255\255\255\255\255\255Y\000\255\255\255\255Y\000Y\000Y\000\255\255\255\255\255\255Y\000Y\000\255\255Y\000Y\000Y\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255M\000Y\000M\000Y\000Y\000Y\000Y\000Y\000\255\255\255\255\255\255Z\000\255\255\255\255Z\000Z\000Z\000\255\255\255\255\255\255Z\000Z\000\255\255Z\000Z\000Z\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255Z\000Y\000Z\000Z\000Z\000Z\000Z\000\255\255\255\255\255\255\255\255\255\255[\000\255\255\255\255[\000[\000[\000\255\255\255\255\255\255[\000[\000\255\255[\000[\000[\000\255\255\255\255\255\255\255\255Y\000\255\255Y\000\255\255\255\255Z\000[\000\255\255[\000[\000[\000[\000[\000\255\255\255\255\255\255\\\000\255\255\255\255\\\000\\\000\\\000\255\255\255\255\255\255\\\000\\\000\255\255\\\000\\\000\\\000\255\255\255\255\255\255\255\255Z\000\255\255Z\000\255\255\255\255:\000\\\000[\000\\\000\\\000\\\000\\\000\\\000\255\255\255\255\255\255b\000\255\255\255\255b\000b\000b\000\255\255\255\255\255\255b\000b\000\255\255b\000b\000b\000\255\255\255\255\255\255\255\255\255\255\255\255[\000\255\255[\000\255\255b\000\\\000b\000b\000b\000b\000b\000\255\255\255\255\255\255h\000\255\255\255\255h\000h\000h\000\255\255\255\255\255\255h\000h\000\255\255h\000h\000h\000\255\255\255\255\255\255\255\255\255\255\255\255\\\000\255\255\\\000\255\255h\000b\000h\000h\000h\000h\000h\000\255\255\255\255\255\255k\000\255\255\255\255k\000k\000k\000\255\255\255\255\255\255k\000k\000\255\255k\000k\000k\000\255\255\255\255\255\255\255\255\255\255\255\255b\000\255\255b\000\255\255k\000h\000k\000k\000k\000k\000k\000\255\255\255\255\255\255l\000\255\255\255\255l\000l\000l\000\255\255\255\255\255\255l\000l\000\255\255l\000l\000l\000\255\255\255\255\255\255\255\255\255\255\255\255h\000\255\255h\000\255\255l\000k\000l\000l\000l\000l\000l\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\255k\000\255\255k\000\255\255\255\255l\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\255l\000\255\255l\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\n\000$\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";
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";
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";
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\000T\000\255\255\255\255T\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\255T\000\000\000U\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255O\000P\000\255\255\255\255\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000O\000O\000O\000O\000O\000O\000O\000O\000O\000O\000P\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\255P\000P\000P\000P\000P\000P\000P\000P\000P\000P\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\255T\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;
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
)
# 1785 "editor/ed_ocaml_lexer.ml"
| 1 ->
# 949 "editor/ed_ocaml_lexer.mll"
( token lexbuf )
# 1790 "editor/ed_ocaml_lexer.ml"
| 2 ->
# 951 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 1795 "editor/ed_ocaml_lexer.ml"
| 3 ->
# 952 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 1800 "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 )
# 1810 "editor/ed_ocaml_lexer.ml"
| 5 ->
# 960 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 1815 "editor/ed_ocaml_lexer.ml"
| 6 ->
# 961 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 1820 "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 )
# 1831 "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
)
# 1845 "editor/ed_ocaml_lexer.ml"
| 9 ->
# 982 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf)
# 1852 "editor/ed_ocaml_lexer.ml"
| 10 ->
# 986 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf
)
# 1860 "editor/ed_ocaml_lexer.ml"
| 11 ->
# 991 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf
)
# 1867 "editor/ed_ocaml_lexer.ml"
| 12 ->
# 995 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf
)
# 1875 "editor/ed_ocaml_lexer.ml"
| 13 ->
# 1000 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf
)
# 1883 "editor/ed_ocaml_lexer.ml"
| 14 ->
# 1005 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf
)
# 1891 "editor/ed_ocaml_lexer.ml"
| 15 ->
# 1010 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
string lexbuf;
token lexbuf
)
# 1900 "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
)
# 1911 "editor/ed_ocaml_lexer.ml"
| 17 ->
# 1024 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf
)
# 1919 "editor/ed_ocaml_lexer.ml"
| 18 ->
# 1029 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf
)
# 1927 "editor/ed_ocaml_lexer.ml"
| 19 ->
# 1034 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf
)
# 1935 "editor/ed_ocaml_lexer.ml"
| 20 ->
# 1039 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
token lexbuf
)
# 1943 "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))
)
# 1953 "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 )
# 1962 "editor/ed_ocaml_lexer.ml"
| 23 ->
# 1057 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line !cur_indent;
comment lexbuf;
token lexbuf
)
# 1971 "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
)
# 1981 "editor/ed_ocaml_lexer.ml"
| 25 ->
let
# 1069 "editor/ed_ocaml_lexer.mll"
num
# 1987 "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
# 1992 "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
)
# 2000 "editor/ed_ocaml_lexer.ml"
| 26 ->
# 1077 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 2005 "editor/ed_ocaml_lexer.ml"
| 27 ->
# 1078 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 2010 "editor/ed_ocaml_lexer.ml"
| 28 ->
# 1079 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 2015 "editor/ed_ocaml_lexer.ml"
| 29 ->
# 1080 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 2020 "editor/ed_ocaml_lexer.ml"
| 30 ->
# 1081 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent; token lexbuf )
# 2025 "editor/ed_ocaml_lexer.ml"
| 31 ->
# 1082 "editor/ed_ocaml_lexer.mll"
(
on_par_open LPAREN lexbuf;
token lexbuf
)
# 2033 "editor/ed_ocaml_lexer.ml"
| 32 ->
# 1086 "editor/ed_ocaml_lexer.mll"
(
on_par_close lexbuf RPAREN ")";
token lexbuf )
# 2040 "editor/ed_ocaml_lexer.ml"
| 33 ->
# 1089 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2046 "editor/ed_ocaml_lexer.ml"
| 34 ->
# 1091 "editor/ed_ocaml_lexer.mll"
( on_keyword lexbuf COMMA;
token lexbuf )
# 2052 "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 )
# 2059 "editor/ed_ocaml_lexer.ml"
| 36 ->
# 1096 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2065 "editor/ed_ocaml_lexer.ml"
| 37 ->
# 1098 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2071 "editor/ed_ocaml_lexer.ml"
| 38 ->
# 1100 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2077 "editor/ed_ocaml_lexer.ml"
| 39 ->
# 1102 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2083 "editor/ed_ocaml_lexer.ml"
| 40 ->
# 1104 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2089 "editor/ed_ocaml_lexer.ml"
| 41 ->
# 1106 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2095 "editor/ed_ocaml_lexer.ml"
| 42 ->
# 1108 "editor/ed_ocaml_lexer.mll"
( on_keyword lexbuf SEMI;
token lexbuf )
# 2101 "editor/ed_ocaml_lexer.ml"
| 43 ->
# 1110 "editor/ed_ocaml_lexer.mll"
(
set_indent 0;
if_first_token_on_line !cur_indent;
token lexbuf )
# 2109 "editor/ed_ocaml_lexer.ml"
| 44 ->
# 1114 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2115 "editor/ed_ocaml_lexer.ml"
| 45 ->
# 1116 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2121 "editor/ed_ocaml_lexer.ml"
| 46 ->
# 1118 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2127 "editor/ed_ocaml_lexer.ml"
| 47 ->
# 1120 "editor/ed_ocaml_lexer.mll"
( on_par_open LBRACKET lexbuf;
token lexbuf )
# 2133 "editor/ed_ocaml_lexer.ml"
| 48 ->
# 1122 "editor/ed_ocaml_lexer.mll"
( on_par_open LBRACKETBAR lexbuf ;
token lexbuf )
# 2139 "editor/ed_ocaml_lexer.ml"
| 49 ->
# 1124 "editor/ed_ocaml_lexer.mll"
( on_par_open LBRACKETLESS lexbuf ;
token lexbuf )
# 2145 "editor/ed_ocaml_lexer.ml"
| 50 ->
# 1126 "editor/ed_ocaml_lexer.mll"
( on_par_open LBRACKETGREATER lexbuf;
token lexbuf )
# 2151 "editor/ed_ocaml_lexer.ml"
| 51 ->
# 1128 "editor/ed_ocaml_lexer.mll"
( on_par_close lexbuf RBRACKET "]";
token lexbuf )
# 2157 "editor/ed_ocaml_lexer.ml"
| 52 ->
# 1130 "editor/ed_ocaml_lexer.mll"
( on_par_open LBRACE lexbuf ;
token lexbuf )
# 2163 "editor/ed_ocaml_lexer.ml"
| 53 ->
# 1132 "editor/ed_ocaml_lexer.mll"
( on_par_open LBRACELESS lexbuf ;
token lexbuf )
# 2169 "editor/ed_ocaml_lexer.ml"
| 54 ->
# 1134 "editor/ed_ocaml_lexer.mll"
(
on_keyword lexbuf BAR;
token lexbuf )
# 2176 "editor/ed_ocaml_lexer.ml"
| 55 ->
# 1137 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2182 "editor/ed_ocaml_lexer.ml"
| 56 ->
# 1139 "editor/ed_ocaml_lexer.mll"
( on_par_close lexbuf BARRBRACKET "|]";
token lexbuf )
# 2188 "editor/ed_ocaml_lexer.ml"
| 57 ->
# 1141 "editor/ed_ocaml_lexer.mll"
( token lexbuf )
# 2193 "editor/ed_ocaml_lexer.ml"
| 58 ->
# 1142 "editor/ed_ocaml_lexer.mll"
( on_par_close lexbuf GREATERRBRACKET ">]";
token lexbuf )
# 2199 "editor/ed_ocaml_lexer.ml"
| 59 ->
# 1144 "editor/ed_ocaml_lexer.mll"
( on_par_close lexbuf RBRACE "}";
token lexbuf )
# 2205 "editor/ed_ocaml_lexer.ml"
| 60 ->
# 1146 "editor/ed_ocaml_lexer.mll"
( on_par_close lexbuf GREATERRBRACE ">}";
token lexbuf )
# 2211 "editor/ed_ocaml_lexer.ml"
| 61 ->
# 1148 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2217 "editor/ed_ocaml_lexer.ml"
| 62 ->
# 1150 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2223 "editor/ed_ocaml_lexer.ml"
| 63 ->
# 1152 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2229 "editor/ed_ocaml_lexer.ml"
| 64 ->
# 1154 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2235 "editor/ed_ocaml_lexer.ml"
| 65 ->
# 1158 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2241 "editor/ed_ocaml_lexer.ml"
| 66 ->
# 1161 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2247 "editor/ed_ocaml_lexer.ml"
| 67 ->
# 1164 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2253 "editor/ed_ocaml_lexer.ml"
| 68 ->
# 1167 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2259 "editor/ed_ocaml_lexer.ml"
| 69 ->
# 1170 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2265 "editor/ed_ocaml_lexer.ml"
| 70 ->
# 1173 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2271 "editor/ed_ocaml_lexer.ml"
| 71 ->
# 1176 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line !cur_indent;
token lexbuf )
# 2277 "editor/ed_ocaml_lexer.ml"
| 72 ->
# 1178 "editor/ed_ocaml_lexer.mll"
( EOF )
# 2282 "editor/ed_ocaml_lexer.ml"
| 73 ->
# 1180 "editor/ed_ocaml_lexer.mll"
( raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0),
curr_loc lexbuf))
)
# 2289 "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
)
# 2306 "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
)
# 2316 "editor/ed_ocaml_lexer.ml"
| 2 ->
# 1201 "editor/ed_ocaml_lexer.mll"
( raise (Error (Unterminated_comment, curr_loc lexbuf)) )
# 2321 "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 )
# 2328 "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 115
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
)
# 2341 "editor/ed_ocaml_lexer.ml"
| 1 ->
# 1213 "editor/ed_ocaml_lexer.mll"
( if_first_token_on_line_set_none () )
# 2346 "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
)
# 2356 "editor/ed_ocaml_lexer.ml"
| 3 ->
# 1222 "editor/ed_ocaml_lexer.mll"
( raise (Error (Unterminated_string, curr_loc lexbuf)) )
# 2361 "editor/ed_ocaml_lexer.ml"
| 4 ->
# 1224 "editor/ed_ocaml_lexer.mll"
(
if_first_token_on_line_set_none ();
string lexbuf )
# 2368 "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 118
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 )
# 2379 "editor/ed_ocaml_lexer.ml"
| 1 ->
# 1232 "editor/ed_ocaml_lexer.mll"
( update_loc lexbuf None 1 false 0 )
# 2384 "editor/ed_ocaml_lexer.ml"
| 2 ->
# 1233 "editor/ed_ocaml_lexer.mll"
( () )
# 2389 "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))
# 2409 "editor/ed_ocaml_lexer.ml"