Plasma GitLab Archive
Projects Blog Knowledge

# 3 "netglob_lex.mll"
 
  exception Bracket_Unsupported
  exception Lexing_Error

  type bracket_token =
      Bracket_char of char
    | Bracket_range of (char * char)
    | Bracket_code of int  (* see Netglob.reparse_bracket_expr *)
    | Bracket_end

  type brace_token =
      Brace_literal of string
    | Brace_comma
    | Brace_braces of brace_token list  (* inner braces *)
    | Brace_end

  type glob_features =
      { enable_star : bool;
	enable_qmark : bool;
	enable_brackets : bool;
	enable_braces : bool;
	enable_tilde : bool;
	enable_escape : bool;
	mutable escaped : bool;  (* after a backslash *)
      }

  type glob_token =
      Glob_literal of string
    | Glob_star
    | Glob_qmark
    | Glob_brackets of (bool * bracket_token list)
    | Glob_braces of brace_token list
    | Glob_tilde of string * bool (* whether there is a slash *)
    | Glob_end

  type exploded_char =
      C of char   (* An unescaped character *)
    | E of char   (* An escaped character *)
    | Delim of char  (* delimiter *)



  let rec collect_until end_token parse_fun lexbuf =
    let tok = parse_fun lexbuf in
    if tok = end_token then
      []
    else
      tok :: (collect_until end_token parse_fun lexbuf)


  let string_of_exploded l =
    String.concat "" 
      (List.map
	 (function 
	    | C c -> String.make 1 c
	    | E c -> String.make 1 c
	    | Delim _ -> ""
	 )
	 l
      )

  let have_delim l =
    List.exists (function Delim _ -> true | _ -> false) l


# 68 "netglob_lex.ml"
let __ocaml_lex_tables = {
  Lexing.lex_base = 
   "\000\000\250\255\000\000\252\255\001\000\001\000\002\000\003\000\
    \006\000\000\000\002\000\255\255\002\000\003\000\254\255\000\000\
    \004\000\253\255\251\255\007\000\251\255\005\000\007\000\008\000\
    \005\000\009\000\011\000\002\000\006\000\255\255\005\000\007\000\
    \254\255\006\000\009\000\253\255\252\255\012\000\250\255\251\255\
    \004\000\253\255\254\255\255\255\252\255\013\000\251\255\252\255\
    \253\255\254\255\255\255\029\000\248\255\040\000\250\255\251\255\
    \252\255\011\000\254\255\255\255\253\255\014\000\253\255\254\255\
    \010\000\255\255\015\000\254\255\255\255";
  Lexing.lex_backtrk = 
   "\255\255\255\255\006\000\255\255\006\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\005\000\005\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\
    \006\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\006\000\255\255\255\255\
    \255\255\002\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \001\000\255\255\255\255\255\255\255\255";
  Lexing.lex_default = 
   "\002\000\000\000\255\255\000\000\255\255\018\000\015\000\012\000\
    \009\000\255\255\255\255\000\000\255\255\255\255\000\000\255\255\
    \255\255\000\000\000\000\021\000\000\000\255\255\255\255\036\000\
    \033\000\030\000\027\000\255\255\255\255\000\000\255\255\255\255\
    \000\000\255\255\255\255\000\000\000\000\039\000\000\000\000\000\
    \044\000\000\000\000\000\000\000\000\000\047\000\000\000\000\000\
    \000\000\000\000\000\000\053\000\000\000\053\000\000\000\000\000\
    \000\000\255\255\000\000\000\000\000\000\063\000\000\000\000\000\
    \065\000\000\000\068\000\000\000\000\000";
  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\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \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\005\000\005\000\007\000\
    \013\000\255\255\023\000\031\000\023\000\025\000\000\000\255\255\
    \042\000\049\000\010\000\008\000\028\000\016\000\006\000\255\255\
    \255\255\026\000\255\255\034\000\024\000\255\255\000\000\059\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\004\000\058\000\003\000\255\255\011\000\
    \014\000\017\000\022\000\029\000\032\000\255\255\035\000\255\255\
    \040\000\060\000\064\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \057\000\054\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\255\255\255\255\000\000\000\000\041\000\
    \048\000\043\000\050\000\000\000\000\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\000\000\000\000\055\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\255\255\000\000\000\000\255\255\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \001\000\255\255\255\255\255\255\255\255\255\255\255\255\020\000\
    \255\255\255\255\255\255\255\255\038\000\046\000\062\000\067\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\052\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \255\255";
  Lexing.lex_check = 
   "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\057\000\002\000\004\000\004\000\
    \012\000\007\000\021\000\030\000\022\000\022\000\255\255\025\000\
    \037\000\045\000\009\000\004\000\027\000\015\000\004\000\006\000\
    \008\000\022\000\024\000\033\000\022\000\026\000\255\255\051\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\053\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\000\000\051\000\000\000\005\000\010\000\
    \013\000\016\000\019\000\028\000\031\000\023\000\034\000\053\000\
    \037\000\057\000\061\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\
    \051\000\051\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\053\000\053\000\255\255\255\255\037\000\
    \045\000\037\000\045\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\
    \051\000\255\255\255\255\051\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\053\000\255\255\255\255\053\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\
    \000\000\005\000\006\000\007\000\040\000\024\000\008\000\019\000\
    \023\000\025\000\064\000\026\000\037\000\045\000\061\000\066\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\051\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \053\000";
  Lexing.lex_base_code = 
   "";
  Lexing.lex_backtrk_code = 
   "";
  Lexing.lex_default_code = 
   "";
  Lexing.lex_trans_code = 
   "";
  Lexing.lex_check_code = 
   "";
  Lexing.lex_code = 
   "";
}

let rec bracket_rest lexbuf =
  __ocaml_lex_bracket_rest_rec lexbuf 0
and __ocaml_lex_bracket_rest_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 74 "netglob_lex.mll"
                       ( raise Bracket_Unsupported )
# 199 "netglob_lex.ml"

  | 1 ->
# 75 "netglob_lex.mll"
                       ( raise Bracket_Unsupported )
# 204 "netglob_lex.ml"

  | 2 ->
# 76 "netglob_lex.mll"
                       ( raise Bracket_Unsupported )
# 209 "netglob_lex.ml"

  | 3 ->
# 77 "netglob_lex.mll"
                       ( Bracket_end )
# 214 "netglob_lex.ml"

  | 4 ->
# 79 "netglob_lex.mll"
                       ( let c0 = Lexing.lexeme_char lexbuf 0 in
			 let c1 = Lexing.lexeme_char lexbuf 2 in
			 if c0 > '\127' || c1 > '\127' then raise Lexing_Error;
			 if c0 > c1 then raise Lexing_Error;
			 Bracket_range(c0,c1)
		       )
# 224 "netglob_lex.ml"

  | 5 ->
# 85 "netglob_lex.mll"
                       ( raise Lexing_Error )
# 229 "netglob_lex.ml"

  | 6 ->
# 86 "netglob_lex.mll"
                       ( Bracket_char (Lexing.lexeme_char lexbuf 0) )
# 234 "netglob_lex.ml"

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

and bracket_first lexbuf =
  __ocaml_lex_bracket_first_rec lexbuf 19
and __ocaml_lex_bracket_first_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 94 "netglob_lex.mll"
                       ( raise Bracket_Unsupported )
# 245 "netglob_lex.ml"

  | 1 ->
# 95 "netglob_lex.mll"
                       ( raise Bracket_Unsupported )
# 250 "netglob_lex.ml"

  | 2 ->
# 96 "netglob_lex.mll"
                       ( raise Bracket_Unsupported )
# 255 "netglob_lex.ml"

  | 3 ->
# 97 "netglob_lex.mll"
                       ( let c0 = Lexing.lexeme_char lexbuf 0 in
			 let c1 = Lexing.lexeme_char lexbuf 2 in
			 if c0 > '\127' || c1 > '\127' then raise Lexing_Error;
			 if c0 > c1 then raise Lexing_Error;
			 Bracket_range(c0,c1)
		       )
# 265 "netglob_lex.ml"

  | 4 ->
# 103 "netglob_lex.mll"
                       ( raise Lexing_Error )
# 270 "netglob_lex.ml"

  | 5 ->
# 104 "netglob_lex.mll"
                       ( Bracket_char (Lexing.lexeme_char lexbuf 0) )
# 275 "netglob_lex.ml"

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

and brace lexbuf =
  __ocaml_lex_brace_rec lexbuf 37
and __ocaml_lex_brace_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 112 "netglob_lex.mll"
                       ( Brace_end )
# 286 "netglob_lex.ml"

  | 1 ->
# 113 "netglob_lex.mll"
                       ( Brace_comma )
# 291 "netglob_lex.ml"

  | 2 ->
# 114 "netglob_lex.mll"
                       ( let l = collect_until Brace_end brace lexbuf in
			 Brace_braces l )
# 297 "netglob_lex.ml"

  | 3 ->
# 116 "netglob_lex.mll"
                       ( Brace_literal (Lexing.lexeme lexbuf) )
# 302 "netglob_lex.ml"

  | 4 ->
# 117 "netglob_lex.mll"
                           ( Brace_literal (Lexing.lexeme lexbuf) )
# 307 "netglob_lex.ml"

  | 5 ->
# 118 "netglob_lex.mll"
                       ( raise Lexing_Error )
# 312 "netglob_lex.ml"

  | 6 ->
# 119 "netglob_lex.mll"
                       ( raise Lexing_Error )
# 317 "netglob_lex.ml"

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

and brace_noescape lexbuf =
  __ocaml_lex_brace_noescape_rec lexbuf 45
and __ocaml_lex_brace_noescape_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 126 "netglob_lex.mll"
                       ( Brace_end )
# 328 "netglob_lex.ml"

  | 1 ->
# 127 "netglob_lex.mll"
                       ( Brace_comma )
# 333 "netglob_lex.ml"

  | 2 ->
# 128 "netglob_lex.mll"
                       ( let l = collect_until Brace_end brace_noescape lexbuf in
			 Brace_braces l )
# 339 "netglob_lex.ml"

  | 3 ->
# 130 "netglob_lex.mll"
                       ( Brace_literal (Lexing.lexeme lexbuf) )
# 344 "netglob_lex.ml"

  | 4 ->
# 131 "netglob_lex.mll"
                       ( raise Lexing_Error )
# 349 "netglob_lex.ml"

  | 5 ->
# 132 "netglob_lex.mll"
                       ( raise Lexing_Error )
# 354 "netglob_lex.ml"

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

and glob_expr feat lexbuf =
  __ocaml_lex_glob_expr_rec feat lexbuf 51
and __ocaml_lex_glob_expr_rec feat lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 135 "netglob_lex.mll"
                       ( if feat.enable_star && not feat.escaped then 
			   Glob_star
			 else (
			   feat.escaped <- false;
			   Glob_literal "*"
			 )
		       )
# 371 "netglob_lex.ml"

  | 1 ->
# 142 "netglob_lex.mll"
                       ( if feat.enable_qmark && not feat.escaped then 
			   Glob_qmark
			 else (
			   feat.escaped <- false;
			   Glob_literal "?"
			 )
		       )
# 382 "netglob_lex.ml"

  | 2 ->
# 149 "netglob_lex.mll"
                       ( if feat.enable_brackets && not feat.escaped then (
			   let negated = 
			     String.length(Lexing.lexeme lexbuf) > 1 in
			   let t0 = bracket_first lexbuf in
			   let l = collect_until 
				     Bracket_end bracket_rest lexbuf in
			   Glob_brackets (negated, t0 :: l)
			 )
			 else (
			   feat.escaped <- false;
			   Glob_literal (Lexing.lexeme lexbuf)
			 )
		       )
# 399 "netglob_lex.ml"

  | 3 ->
# 162 "netglob_lex.mll"
                       ( if feat.enable_braces && not feat.escaped then (
			   let p =
			     if feat.enable_escape then
			       brace
			     else
			       brace_noescape in
			   let l = collect_until Brace_end p lexbuf in
			   Glob_braces l
			 )
			 else (
			   feat.escaped <- false;
			   Glob_literal "{"
			 )
		       )
# 417 "netglob_lex.ml"

  | 4 ->
# 176 "netglob_lex.mll"
                       ( if (feat.enable_tilde && not feat.escaped && 
                             Lexing.lexeme_start lexbuf = 0) then (
			   let p =
			     if feat.enable_escape then
			       generic_lex_until '/'
			     else
			       generic_lex_noescape_until '/' in
			   let l = p lexbuf in
			   let s = string_of_exploded l in
			   let slash = have_delim l in
			   Glob_tilde(s,slash)
			 ) else (
			   feat.escaped <- false;
			   Glob_literal "~"
			 )
                       )
# 437 "netglob_lex.ml"

  | 5 ->
# 192 "netglob_lex.mll"
                       ( if feat.enable_escape && not feat.escaped then (
			   feat.escaped <- true;
			   Glob_literal ""
			 )
			 else (
			   feat.escaped <- false;
			   Glob_literal "\\"
			 )
		       )
# 450 "netglob_lex.ml"

  | 6 ->
# 202 "netglob_lex.mll"
                       ( feat.escaped <- false;
			 Glob_literal (Lexing.lexeme lexbuf)
		       )
# 457 "netglob_lex.ml"

  | 7 ->
# 205 "netglob_lex.mll"
                       ( if feat.escaped then raise Lexing_Error;
			 Glob_end
		       )
# 464 "netglob_lex.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_glob_expr_rec feat lexbuf __ocaml_lex_state

and generic_lex_until c lexbuf =
  __ocaml_lex_generic_lex_until_rec c lexbuf 61
and __ocaml_lex_generic_lex_until_rec c lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 210 "netglob_lex.mll"
                       ( let char = E (Lexing.lexeme_char lexbuf 1) in
                         char :: generic_lex_until c lexbuf )
# 476 "netglob_lex.ml"

  | 1 ->
# 212 "netglob_lex.mll"
                       ( let lc = Lexing.lexeme_char lexbuf 0 in
			 if c = lc then [ Delim c ] else (
                           let char = C lc in
                           char :: generic_lex_until c lexbuf
			 ) )
# 485 "netglob_lex.ml"

  | 2 ->
# 217 "netglob_lex.mll"
                       ( [] )
# 490 "netglob_lex.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_generic_lex_until_rec c lexbuf __ocaml_lex_state

and generic_lex_noescape_until c lexbuf =
  __ocaml_lex_generic_lex_noescape_until_rec c lexbuf 66
and __ocaml_lex_generic_lex_noescape_until_rec c lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 220 "netglob_lex.mll"
                       ( let lc = Lexing.lexeme_char lexbuf 0 in
			 if c = lc then [ Delim c ] else (
                           let char = C lc in
                           char :: generic_lex_noescape_until c lexbuf
			 ) )
# 505 "netglob_lex.ml"

  | 1 ->
# 225 "netglob_lex.mll"
                       ( [] )
# 510 "netglob_lex.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_generic_lex_noescape_until_rec c lexbuf __ocaml_lex_state

;;


This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml