-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJsonParser.fs
More file actions
50 lines (42 loc) · 1.35 KB
/
JsonParser.fs
File metadata and controls
50 lines (42 loc) · 1.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
namespace PidginFsharp.Examples
open System
open PidginFsharp
type Json =
| JsonString of string
| JsonArray of Json list
| JsonObject of Map<string, Json>
module JsonParser =
open Basic
open Sequence
let whitespace = tokenPred Char.IsWhiteSpace
let whitespaces = many whitespace
let lbrace = token '{'
let rbrace = token '}'
let lbracket = token '['
let rbracket = token ']'
let quote = token '"'
let colon = token ':'
let colonWhitespace = between whitespaces whitespaces colon
let comma = token ','
let string =
many (tokenNot '"')
|> between quote quote
|> select String.Concat
let jsonString = string |> select JsonString
let rec jsonRaw state =
oneOf [ jsonString; jsonArray; jsonObject ] <| state
and jsonArray state =
jsonRaw
|> between whitespaces whitespaces
|> separated comma
|> between lbracket rbracket
|> select JsonArray <| state
and jsonMember state =
map2 (fun name value -> name, value) (before colonWhitespace string) jsonRaw <| state
and jsonObject state =
jsonMember
|> between whitespaces whitespaces
|> separated comma
|> between lbrace rbrace
|> select (Map.ofList >> JsonObject) <| state
let json = jsonRaw |> between whitespaces whitespaces