value = map | array | string | multiline_string | number | boolean | null ; map = "{", {field}, "}" | {field}, ";" | {field} >> (EOF | "]") ; field = key, ":", value ; key = '"', {-'"' | '""'}, '"' | (alphanumeric | "_" | "-"), {alphanumeric | "_" | "-"} ; array = "[", {value}, "]" ; string = '"', {-'"' | '\"'}, -("\" | '"'), '"' | '"\""' | '""' | {alphanumeric | " " | "_"}, "," | {alphanumeric | " " | "_"} >> inline_end ; inline_end = "\r" | "\n" | "]" | "}" | ";" | EOF ; multiline_string = "|", end_sequence, "\n", ?any character?, "\n", end_sequence ; end_sequence = {-("\r" | "\n")} ; integer = ["-"], {digit}, ["e", {digit}] ; float = ["-"], {digit}, [".", {digit}], ["e", {digit}] ; number = (integer | float), "," | (integer | float) >> (inline_end | whitespace) ; boolean = "%true" | "%false" ; null = "%null" ;