id = {} ref = function(a) { return null; } { "sequence-descriptors": [ { "field-name": "root", "expr": id["value"] = { "expr-cases": [ { "sequence-descriptors": [ { "sequence-descriptors": [ "id", id["whitespace"] = { "repeat-expr": { "char-class": "whitespace" } } ] }, id["lbracket-token"] = { "sequence-descriptors": ["[", ref("whitespace")] }, { "field-name": "id", "expr": ref("string-token") }, id["rbracket-token"] = { "sequence-descriptors": ["]", ref("whitespace")] }, id["equals-token"] = { "sequence-descriptors": ["=", ref("whitespace")] }, ref("base-value") ] }, { "sequence-descriptors": [ { "sequence-descriptors": ["ref", ref("whitespace")] }, { "sequence-descriptors": ["(", ref("whitespace")] }, { "field-name": "id", "expr": ref("string") }, { "sequence-descriptors": [")", ref("whitespace")] } ] }, id["base-value"] = { "expr-cases": [ id["object"] = { "sequence-descriptors": [ { "sequence-descriptors": ["{", ref("whitespace")] }, { "field-name": "members", "expr": { "repeat-expr": { "sequence-descriptors": [ { "field-name": "key", "expr": ref("string-token") }, { "sequence-descriptors": [":", ref("whitespace")] }, { "field-name": "value", "expr": ref("value") } ] }, "separator": id["comma-token"] = { "sequence-descriptors": [",", ref("whitespace")] } } }, { "sequence-descriptors": ["}", ref("whitespace")] } ] }, id["array"] = { "sequence-descriptors": [ ref("lbracket-token"), { "field-name": "elements", "expr": { "repeat-expr": ref("value"), "separator": ref("comma-token") } }, ref("rbracket-token") ] }, id["string-token"] = { "sequence-descriptors": [ "\"", { "field-name": "string-chars", "expr": { "repeat-expr": { "expr-cases": [ { "sequence-descriptors": [ { "try-not-expr": { "char-class": "control" } }, { "try-not-expr": "\\" }, { "try-not-expr": "\"" }, { "field-name": "standard-char", "expr": { "char-class": "any" } } ] }, "\\b", "\\f", "\\n", "\\r", "\\t", { "sequence-descriptors": [ "\\u", { "field-name": "hex-values", "expr": { "repeat-expr": { "expr-cases": [ {"char-class": "digit"}, {"first": "a", "last": "f"}, {"first": "A", "last": "F"} ] }, "min": 4, "max": 4 } } ] } ] } } }, "\"", ref("whitespace") ] }, id["number"] = { "sequence-descriptors": [ { "field-name": "sign", "expr": { "expr-cases": [null, "-"] } }, { "field-name": "int-part", "expr": { "expr-cases": [ { "char-class": "digit" }, { "sequence-descriptors": [ { "field-name": "first-digit", "expr": id["digit1-9"] = {"first": "1", "last": "9"} }, { "field-name": "rest-digits", "expr": id["digits"] = { "repeat-expr": { "char-class": "digit" }, "min": 1 } } ] } ] } }, { "field-name": "frac-part", "expr": { "repeat-expr": { "sequence-descriptors": [ ".", { "field-name": "frac-digits", "expr": ref("digits") } ] }, "max": 1 } }, { "field-name": "exp-part", "expr": { "repeat-expr": { "sequence-descriptors": [ { "expr-cases": [ "e", "E" ] }, { "field-name": "sign", "expr": {"expr-cases": [null, "+", "-"] } }, { "field-name": "exp-digits", "expr": ref("digits") } ] }, "max": 1 } }, ref("whitespace") ] }, { "sequence-descriptors": [ { "field-name": "true-data", "expr": "true" }, ref("whitespace") ] }, { "sequence-descriptors": [ { "field-name": "false-data", "expr": "false" }, ref("whitespace") ] }, { "sequence-descriptors": [ { "field-name": "null-data", "expr": "null" }, ref("whitespace") ] } ] } ] } } ] }