]> gitweb.factorcode.org Git - factor.git/blob - basis/json/reader/reader.factor
0014ba1eb19d9491254d093308d3223b33d606e7
[factor.git] / basis / json / reader / reader.factor
1 ! Copyright (C) 2008 Peter Burns.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel peg peg.ebnf math.parser math.private strings math
4 math.functions sequences arrays vectors hashtables assocs
5 prettyprint json ;
6 IN: json.reader
7
8 <PRIVATE
9
10 : grammar-list>vector ( seq -- vec ) first2 values swap prefix ;
11
12 ! Grammar for JSON from RFC 4627
13 EBNF: (json>)
14
15 ws = (" " | "\r" | "\t" | "\n")*
16
17 true = "true" => [[ t ]]
18 false = "false" => [[ f ]]
19 null = "null" => [[ json-null ]]
20
21 hex = [0-9a-fA-F]
22 char = '\\"'  [[ CHAR: "  ]]
23      | "\\\\" [[ CHAR: \  ]]
24      | "\\/"  [[ CHAR: /  ]]
25      | "\\b"  [[ 8        ]]
26      | "\\f"  [[ 12       ]]
27      | "\\n"  [[ CHAR: \n ]]
28      | "\\r"  [[ CHAR: \r ]]
29      | "\\t"  [[ CHAR: \t ]]
30      | "\\u" (hex hex hex hex) [[ hex> ]] => [[ second ]]
31      | [^"\]
32 string = '"' char*:cs '"' => [[ cs >string ]]
33
34 sign = ("-" | "+")? => [[ "-" = "-" "" ? ]]
35 digits = [0-9]+     => [[ >string ]]
36 decimal = "." digits  => [[ concat ]]
37 exp = ("e" | "E") sign digits => [[ concat ]]
38 number = sign digits decimal? exp? => [[ dup concat swap fourth [ string>float ] [ string>number ] if ]]
39
40 elements = value ("," value)* => [[ grammar-list>vector ]]
41 array = "[" elements?:arr "]" => [[ arr >array ]]
42
43 pair = ws string:key ws ":" value:val => [[ { key val } ]]
44 members = pair ("," pair)* => [[ grammar-list>vector ]]
45 object = "{" members?:hash "}" => [[ hash >hashtable ]]
46
47 val = true
48     | false
49     | null
50     | string
51     | number
52     | array
53     | object
54
55 value = ws val:v ws => [[ v ]]
56
57 ;EBNF
58
59 PRIVATE>
60
61 : json> ( string -- object ) (json>) ;