Advertisement
Guest User

Untitled

a guest
Jul 26th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.12 KB | None | 0 0
  1. type token =
  2.     | DoubleUnderscore
  3.     | Underscore
  4.     | DoubleTimes
  5.     | Times
  6.     | EmptyToken
  7.     | Literal of string
  8.  
  9. let (|StartsWith|_|) (p:string) (s:string) =
  10.     if s.StartsWith(p) then
  11.         Some(s.Substring(p.Length))
  12.     else
  13.         None
  14.  
  15. let buildToken charlist =
  16.     match charlist with
  17.     | [] -> EmptyToken
  18.     | _ -> Literal(System.String.Concat<char> (List.rev charlist))
  19.  
  20. let rec tokenize str =
  21.     let rec helper str litAccu accu =
  22.         match str with
  23.         | StartsWith "__" _ -> helper (str.Substring 2) [] (DoubleUnderscore :: (buildToken litAccu) :: accu)
  24.         | StartsWith "**" _ -> helper (str.Substring 2) [] (DoubleTimes :: (buildToken litAccu) :: accu)
  25.         | StartsWith "_" _ -> helper (str.Substring 1) [] (Underscore :: (buildToken litAccu) :: accu)
  26.         | StartsWith "*" _ -> helper (str.Substring 1) [] (Times :: (buildToken litAccu) :: accu)
  27.         | "" -> (buildToken litAccu) :: accu
  28.         | _ -> helper (str.Substring 1) (str.[0] :: litAccu) accu
  29.     helper str [] [] |> List.rev |> List.filter (fun x -> x <> EmptyToken)
  30.  
  31. tokenize "foo_bar__**baz!!a*sereje"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement