Advertisement
Guest User

Untitled

a guest
May 15th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.54 KB | None | 0 0
  1. let parseJson source =
  2.     let rec parseObject (obj:(string*JSON) list) =
  3.         let rec parseMember =
  4.             let rec parseValue =
  5.                 let rec parseArray acc = function
  6.                     | Token.CloseSBrace::ts -> (JSON.Array acc, ts)
  7.                     | (Token.Comma | Token.OpenSBrace)::ts ->
  8.                         let (parsed, ts') = parseValue ts
  9.                        parseArray (parsed::acc) ts'
  10.                 function
  11.                 | Token.String str::ts -> (JSON.String str, ts)
  12.                 | Token.Number str::ts -> (JSON.Number (int str), ts)
  13.                 | Token.True::ts -> (JSON.Boolean true, ts)
  14.                 | Token.False::ts -> (JSON.Boolean false, ts)
  15.                 | Token.OpenBrace::ts ->
  16.                     let (parsed, ts') = parseObject [] (Token.OpenBrace::ts)
  17.                    (parsed, ts')
  18.                 | Token.OpenSBrace::ts ->
  19.                     let (parsed, ts') = parseArray [] (Token.OpenSBrace::ts)
  20.                    (parsed, ts')
  21.                 | Token.Null::ts -> (JSON.Null, ts)
  22.             function
  23.             | Token.String name::Colon::ts ->
  24.                 let (parsed, ts') = parseValue ts
  25.                ((name, parsed), ts')
  26.         function
  27.         | CloseBrace::ts -> (JSON.Object obj, ts)
  28.         | (OpenBrace | Comma)::ts ->
  29.             let (parsed, ts') = parseMember ts
  30.            parseObject (parsed::obj) ts'                
  31.     match parseObject [] source with
  32.     res, [] -> res
  33.     | _, _ -> failwith "Mailformed token list"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement