An array element can be any other data element - a string, an array, a dictionary, etc.
Any number of spaces, tabulation symbols, and/or line breaks (end-of-line symbols) can be placed between a parentheses and an element, and between an element and a comma sign.
A Dictionary value can be either a string, or an array, or a dictionary, so the format definition is recursive.
A dictionary is a list of key-value pairs. Each key should be unique, and the key names are case-sensitive. The equal sign (=) is placed between the key and its value, end the semicolon symbol (;) is placed after a value. The set of key-value pairs is enclosed into the curvy brackets. Each key is a string.
The value element in any key-value pair can be a string, an array, and/or a dictionary.
Any number of spaces, tabulation symbols, and/or line breaks (end-of-line symbols) can be placed between a bracket and a pair, around the equal sign, and around the semicolon sign.
d-digit ::= 0 .. 9 a-symbol ::= A .. Z | a .. z | d-digit l-symbol ::= a-symbol | . | _ atom ::= 1*l-symbol b-symbol ::= a-symbol | + | / | = s-symbol ::= any printable symbol except " and \ | \\ | \" | \r | \n | \e | \nnn string ::= " 0*s-symbol " | atom datablock ::= [ 1*b-symbol ] day ::= 0 .. 3 d-digit (2-digit number in the 1..31 range) month ::= 0 .. 1 d-digit (2-digit number in the 1..12 range) year ::= 1 .. 2 d-digit d-digit d-digit (4-digit number in the 1970..2038 range) hour ::= 0 .. 2 d-digit (2-digit number in the 0..23 range) minute ::= 0 .. 5 d-digit (2-digit number in the 0..59 range) second ::= 0 .. 5 d-digit (2-digit number in the 0..59 range) number ::= # [ -] 1*d-digit timestamp ::= # T day - month - year [ _ hour : minute : second ] array ::= ( [object [, object ...]] ) dictionary ::= { [string = object ; [string = object ; ...]] } object ::= string | datablock | number |timestamp | array | dictionary |