on ca34dec help sign in
71 lines 1.9 kB history raw
1module Language.JSON.Parser
3import Language.JSON.Data
4import Text.Parser
5import Text.Token
7import public Language.JSON.Tokens
9%access private
10%default total
12punct : Punctuation -> Grammar JSONToken True ()
13punct p = match $ JTPunct p
15rawString : Grammar JSONToken True String
16rawString = do mstr <- match JTString
17 the (Grammar _ False _) $
18 case mstr of
19 Just str => pure str
20 Nothing => fail "invalid string"
22mutual
23 json : Grammar JSONToken True JSON
24 json = object
25 <|> array
26 <|> string
27 <|> boolean
28 <|> number
29 <|> null
31 object : Grammar JSONToken True JSON
32 object = do punct $ Curly Open
33 commit
34 props <- properties
35 punct $ Curly Close
36 pure $ JObject props
37 where
38 properties : Grammar JSONToken False (List (String, JSON))
39 properties = sepBy (punct Comma) $
40 do key <- rawString
41 punct Colon
42 value <- json
43 pure (key, value)
45 array : Grammar JSONToken True JSON
46 array = do punct (Square Open)
47 commit
48 vals <- values
49 punct (Square Close)
50 pure (JArray vals)
51 where
52 values : Grammar JSONToken False (List JSON)
53 values = sepBy (punct Comma) json
55 string : Grammar JSONToken True JSON
56 string = map JString rawString
58 boolean : Grammar JSONToken True JSON
59 boolean = map JBoolean $ match JTBoolean
61 number : Grammar JSONToken True JSON
62 number = map JNumber $ match JTNumber
64 null : Grammar JSONToken True JSON
65 null = map (const JNull) $ match JTNull
67export
68parseJSON : List JSONToken -> Maybe JSON
69parseJSON toks = case parse json $ filter (not . ignored) toks of
70 Right (j, []) => Just j
71 _ => Nothing