Skip to content

Commit 904146f

Browse files
committed
Adds JSON grammar description in multiple forms
1 parent 04d60bb commit 904146f

4 files changed

Lines changed: 277 additions & 0 deletions

File tree

json.abnf

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
;; -*- mode: text; coding: utf-8; indent-tabs-mode: nil; -*-
2+
;; JSON grammar in augmented Backus-Naur form
3+
4+
json = element
5+
6+
value = object / array / string / number / "true" / "false" / "null"
7+
8+
object = "{" *WS "}" / "{" 1*member "}"
9+
10+
member = *WS string *WS ":" element
11+
12+
array = "[" *WS "]" / "[" 1*element "]"
13+
14+
element = *WS value *WS
15+
16+
string = DQUOTE *CHARACTER DQUOTE
17+
18+
CHARACTER = %x20 / %x21 / %x23-5b / % x5d-ff
19+
20+
escape = DQUOTE ; "
21+
escape =/ REVERSE_SOLIDUS ; \
22+
escape =/ SOLIDUS ; /
23+
escape =/ LATIN_SMALL_LETTER_B ; b
24+
escape =/ LATIN_SMALL_LETTER_F ; f
25+
escape =/ LATIN_SMALL_LETTER_N ; n
26+
escape =/ LATIN_SMALL_LETTER_R ; r
27+
escape =/ LATIN_SMALL_LETTER_T ; t
28+
escape =/ LATIN_SMALL_LETTER_U 4HEX ; uABCD
29+
30+
HEX = DIGIT / %x41-46 / %x61-66
31+
32+
number = integer [fraction] [exponent]
33+
34+
integer = DIGIT
35+
integer =/ ONENINE *DIGIT
36+
integer =/ HYPHEN_MINUS DIGIT
37+
integer =/ HYPHEN_MINUS ONENINE *DIGIT
38+
39+
fraction = FULL_STOP 1*DIGIT
40+
41+
exponent = EXP [SGN] 1*DIGIT
42+
43+
ONENINE = %x31-39
44+
45+
EXP = LATIN_CAPITAL_LETTER_E / LATIN_SMALL_LETTER_E
46+
47+
SGN = PLUS_SIGN / HYPHEN_MINUS
48+
49+
WS = HTAB / LF / CR / SP
50+
51+
; Aux. def. for readability
52+
PLUS_SIGN = %x2B ; +
53+
HYPHEN_MINUS = %x2D ; -
54+
FULL_STOP = %x2E ; .
55+
SOLIDUS = %x2F ; /
56+
LATIN_CAPITAL_LETTER_E = %x45 ; E
57+
LATIN_SMALL_LETTER_B = %x62 ; b
58+
LATIN_SMALL_LETTER_E = %x65 ; e
59+
LATIN_SMALL_LETTER_F = %x66 ; f
60+
LATIN_SMALL_LETTER_N = %x6E ; n
61+
LATIN_SMALL_LETTER_R = %x72 ; r
62+
LATIN_SMALL_LETTER_T = %x74 ; t
63+
LATIN_SMALL_LETTER_U = %x75 ; u
64+
REVERSE_SOLIDUS = %x5C ; \
65+
66+
; Core rules from ABNF
67+
HTAB = %x09 ; horizontal tabulation
68+
LF = %x0a ; line feed
69+
CR = %x0d ; carriage return
70+
SP = %x20 ; space
71+
DQUOTE = %x22 ; quotation mark
72+
DIGIT = %x30-39 ; 0, ..., 9

json.bnf

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
;; -*- mode: text; coding: utf-8; indent-tabs-mode: nil; -*-
2+
;; JSON grammar in Backus-Naur form
3+
4+
<json> ::= <element>
5+
6+
<value> ::= <object> | <array> | <string> | <number> | true | false | null
7+
8+
<object> ::= { <ws> } | { <members> }
9+
10+
<members> ::= <member> | <member> , <members>
11+
12+
<member> ::= <ws> <string> <ws> ":" <element>
13+
14+
<array> ::= [ <ws> ] | [ <elements> ]
15+
16+
<elements> ::= <element> | <element> , <elements>
17+
18+
<element> ::= <ws> <value> <ws>
19+
20+
<string> ::= '"' <characters> '"'
21+
22+
<characters> ::= "" | <character> <characters>
23+
24+
<character> ::= " " | . | # | ... | [ | ] | ...
25+
26+
<escape> ::= '"' | \ | / | b | f | n | r | t | u <hex> <hex> <hex> <hex>
27+
28+
<hex> ::= <digit> | A | B | C | D | E | F | a | b | c | d | e | f
29+
30+
<number> ::= <integer> <fraction> <exponent>
31+
32+
<integer> ::= <digit> | <onenine> <digits> | - <digit> | - <onenine> <digits>
33+
34+
<digits> ::= <digit> | <digits> <digit>
35+
36+
<digit> ::= 0 | <onenine>
37+
38+
<onenine> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
39+
40+
<fraction> ::= "" | . <digits>
41+
42+
<exponent> ::= "" | E <sign> <digits> | e <sign> <digits>
43+
44+
<sign> ::= "" | + | -
45+
46+
<ws> ::= "" | <HT> <ws> | <LF> <ws> | <CR> <ws> | <SP> <ws>

json.ebnf

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/* -*- mode: text; coding: utf-8; indent-tabs-mode: nil; -*- */
2+
/* JSON grammer in extended Backus-Naur form */
3+
4+
json = element;
5+
6+
value = object
7+
| array
8+
| string
9+
| number
10+
| 't', 'r', 'u', 'e'
11+
| 'f', 'a', 'l', 's', 'e'
12+
| 'n', 'u', 'l ', 'l'
13+
;
14+
15+
object = '{', {ws}, '}' | '{', member, {',', member}, '}';
16+
17+
member = {ws}, string, {ws}, ':', element;
18+
19+
array = '[', {ws}, ']' |'[', element, {',', element}, ']';
20+
21+
element = {ws}, value, {ws};
22+
23+
string = '"', {character}, '"';
24+
25+
character = -(ctrl_char|quote_char|escape_char) ;
26+
27+
ctrl_char = ? Any Unicode codepoint u. U+0000 <= u <= U+001F ? ;
28+
29+
quote_char = '"';
30+
31+
escape_char = '\';
32+
33+
escape = '"' | '\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u', 4 * hex;
34+
35+
hex = digit | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
36+
37+
number = integer, [fraction], [exponent];
38+
39+
integer = digit | onenine, {digit} | '-', digit | '-', onenine, {digit};
40+
41+
digit = '0' | onenine;
42+
43+
onenine = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
44+
45+
fraction = '.', digit, {digit};
46+
47+
exponent = ('E'|'e'), [sign], digit, {digit};
48+
49+
sign = '+' | '-';
50+
51+
ws = ? unicode codepoint u+0009 ?
52+
| ? unicode codepoint u+000a ?
53+
| ? unicode codepoint u+000d ?
54+
| ? unicode codepoint u+0020 ?
55+
;

json.mkf

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
;;; -*- mode: text; coding: utf-8; indent-tabs-mode: nil; -*-
2+
;; JSON grammar in McKeeman form
3+
4+
json
5+
element
6+
7+
value
8+
object
9+
array
10+
string
11+
number
12+
"true"
13+
"false"
14+
"null"
15+
16+
object
17+
'{' ws '}'
18+
'{' members '}'
19+
20+
members
21+
member
22+
member ',' members
23+
24+
member
25+
ws string ws ':' element
26+
27+
array
28+
'[' ws ']'
29+
'[' elements ']'
30+
31+
elements
32+
element
33+
element ',' elements
34+
35+
element
36+
ws value ws
37+
38+
string
39+
'"' characters '"'
40+
41+
characters
42+
""
43+
character characters
44+
45+
character
46+
'0020' . '10FFFF' - '"' - '\'
47+
'\' escape
48+
49+
escape
50+
'"'
51+
'\'
52+
'/'
53+
'b'
54+
'f'
55+
'n'
56+
'r'
57+
't'
58+
'u' hex hex hex hex
59+
60+
hex
61+
digit
62+
'a' . 'f'
63+
'A' . 'F'
64+
65+
number
66+
integer fraction exponent
67+
68+
integer
69+
digit
70+
onenine digits
71+
'-' digit
72+
'-' onenine digits
73+
74+
digits
75+
digit
76+
digit digits
77+
78+
digit
79+
'0'
80+
onenine
81+
82+
onenine
83+
'1' . '9'
84+
85+
fraction
86+
""
87+
'.' digits
88+
89+
exponent
90+
""
91+
'E' sign digits
92+
'e' sign digits
93+
94+
sign
95+
""
96+
'+'
97+
'-'
98+
99+
ws
100+
""
101+
'0009' ws
102+
'000A' ws
103+
'000D' ws
104+
'0020' ws

0 commit comments

Comments
 (0)