jsonc-processed Grammar

JSONC-text

JSONC-text := wsc value wsc
wscvaluewsc

wsc

wsc := *(ws-char / comment)
ws-charcomment

ws-char

ws-char := %x20 / %x09 / %x0A / %x0D  ; space / tab / LF / CR
<SP><TAB><LF><CR>

comment

comment := single-line-comment / multi-line-comment
single-line-commentmulti-line-comment

source-character

source-character := %x00-10FFFF
%x00-10FFFF

comment-terminator

comment-terminator := %x0A / %x0D / %x2028 / %x2029          ; LF / CR / LS / PS
<LF><CR><LS><PS>

comment-terminator-sequence

comment-terminator-sequence := %x0D.0A / %x0A / %x0D / %x2028 / %x2029
<CR><LF><LF><CR><LS><PS>

single-line-comment-start

single-line-comment-start := %x2F.2F             ; // double solidus
//

single-line-comment-end

single-line-comment-end := comment-terminator-sequence
comment-terminator-sequence

single-line-comment

single-line-comment := single-line-comment-start *single-line-comment-char [ single-line-comment-end ]
single-line-comment-startsingle-line-comment-charsingle-line-comment-end

single-line-comment-char

single-line-comment-char := %x00-09 / %x0B-0C / %x0E-2027 / %x202A-10FFFF ; Any source character except comment terminators
%x00-09%x0B-0C%x0E-2027%x202A-10FFFF

multi-line-comment

multi-line-comment := "/*" [ multi-line-comment-chars ] "*/"
/*multi-line-comment-chars*/

multi-line-comment-chars

multi-line-comment-chars := not-asterisk-char [ multi-line-comment-chars ] /
                           "*" [ post-asterisk-comment-chars ]
not-asterisk-charmulti-line-comment-chars*post-asterisk-comment-chars

post-asterisk-comment-chars

post-asterisk-comment-chars := not-forward-slash-or-asterisk-char [ multi-line-comment-chars ] /
                              "*" [ post-asterisk-comment-chars ]
not-forward-slash-or-asterisk-charmulti-line-comment-chars*post-asterisk-comment-chars

not-asterisk-char

not-asterisk-char := %x00-29 / %x2B-10FFFF
%x00-29%x2B-10FFFF

not-forward-slash-or-asterisk-char

not-forward-slash-or-asterisk-char := %x00-29 / %x2B-2E / %x30-10FFFF
%x00-29%x2B-2E%x30-10FFFF

begin-array

begin-array := wsc %x5B wsc  ; [ left square bracket
wsc[wsc

begin-object

begin-object := wsc %x7B wsc  ; { left curly bracket
wsc{wsc

end-array

end-array := wsc %x5D wsc  ; ] right square bracket
wsc]wsc

end-object

end-object := wsc %x7D wsc  ; } right curly bracket
wsc}wsc

name-separator

name-separator := wsc %x3A wsc  ; : colon
wsc:wsc

value-separator

value-separator := wsc %x2C wsc  ; , comma
wsc,wsc

value

value := false / null / true / object / array / number / string
falsenulltrueobjectarraynumberstring

false

false := %x66.61.6C.73.65   ; false
false

true

true := %x74.72.75.65      ; true
true

null

null := %x6E.75.6C.6C      ; null
null

object

object := begin-object [ member *( value-separator member ) ] end-object
begin-objectmembervalue-separatormemberend-object

member

member := string name-separator value
stringname-separatorvalue

array

array := begin-array [ value *( value-separator value ) ] end-array
begin-arrayvaluevalue-separatorvalueend-array

number

number := [ minus ] int [ frac ] [ exp ]
minusintfracexp

decimal-point

decimal-point := %x2E        ; .
.

digit1-9

digit1-9 := %x31-39          ; 1-9
%x31-39

e

e := %x65 / %x45             ; e E
eE

exp

exp := e [ minus / plus ] 1*DIGIT
eminusplusDIGIT

frac

frac := decimal-point 1*DIGIT
decimal-pointDIGIT

int

int := zero / ( digit1-9 *DIGIT )
zerodigit1-9DIGIT

minus

minus := %x2D                ; -
-

plus

plus := %x2B                 ; +
+

zero

zero := %x30                 ; 0
0

string

string := quotation-mark *char quotation-mark
quotation-markcharquotation-mark

char

char := unescaped /
 %x5C (
 %x22 /             ; "    quotation mark  U+0022
 %x5C /             ; \    reverse solidus U+005C
 %x2F /             ; /    solidus         U+002F
 %x62 /             ; b    backspace       U+0008
 %x66 /             ; f    form feed       U+000C
 %x6E /             ; n    line feed       U+000A
 %x72 /             ; r    carriage return U+000D
 %x74 /             ; t    tab             U+0009
 %x75 4HEXDIG       ; uXXXX                U+XXXX
 )
unescaped\"" quotation mark U+0022\\ reverse solidus U+005C// solidus U+002Fbb backspace U+0008ff form feed U+000Cnn line feed U+000Arr carriage return U+000Dtt tab U+0009uuXXXX U+XXXXHEXDIGHEXDIGHEXDIGHEXDIG

quotation-mark

quotation-mark := %x22       ; "
"

unescaped

unescaped := %x20-21 / %x23-5B / %x5D-10FFFF       ; Any code point except quotation mark, reverse solidus or ASCII control chars
%x20-21%x23-5B%x5D-10FFFF