body = {text}* {binding}* {body}?
text = [.*]
_ = [\s*]:white-space
binding
	= \(: {_} {head} ({_} {head-separator} {_} {pattern})? ({_} {body-separator} {_} {body})? {_} :\)
	| \{: {_} {head} ({_} {head-separator} {_} {pattern})? ({_} {body-separator} {_} {body})? {_} :\}
	| \[: {_} {head} ({_} {head-separator} {_} {pattern})? ({_} {body-separator} {_} {body})? {_} :\]

head = {identifier}(.{identifier})* {index-picker}?
identifier
	= [[^\s.]+]
	| `[.*]`
index-picker = \[ {_} {number-range} ({_} , {_} {number-range})* {_} \]
number-range = {number}(:{number}(:{number})?)?

head-separator = =>
pattern
	= \{ {_} ({identifier}|{named-patern}) ({_} , {_} ({identifier}|{named-patern}))* {_}\}:object-pattern
	| \[ ({identifier}|{pattern}|{named-patern})... \]:array-pattern
	| \[
		({identifier}|{pattern}|{named-patern})
		({_} , {_}, ({identifier}|{pattern}|{named-patern}))*
		({_} , {_}, ({identifier}|{pattern}|{named-patern})...)?
	\]:array-pattern
named-pattern = {identifier} {_} : {_} {pattern}

body-separator = [~+]