ometa JSON { number = <('-' )? ('0' | (digit:d ?(d != '0')) digit*) ('.' digit* )? (('E' | 'e') ('+' | '-')? digit* )?>:f -> parseFloat(f), hex = char:x {this.intOfHexDigit(x)}:v ?(v >= 0) -> v, char = :c ?(c != '"' && c != '\\') -> c | '\\' ( '"' | '\\' | '/' -> '/' | 'n' -> '\n' | 'b' -> '\b' | 'f' -> '\f' | 'r' -> '\r' | 't' -> '\t' | 'u' hex:a hex:b hex:c hex:d -> String.fromCharCode(4096*a + 256*b + 16*c + d)), string = '"' char*:s '"' -> s.join(''), scanner = spaces ( number:n -> [`num , n ] | string:s -> [`str , s ] | ``true'' -> [`true , true ] | ``false'' -> [`false, false] | ``null'' -> [`null , null ] | '{' | '}'| '[' | ']' | ',' | ':'), token :t = scanner:s ?(t === s || t === s[0]) -> s, listOf :p = apply(p):e ("," apply(p))*:r -> [e].concat(r) | -> [], value = ("num" | "str" | "true" | "false" | "null"):v -> v[1] | array | object, key_value = ("str":s -> s[1]):k ":" value:v -> [k, v], array = "[" listOf('value' ):l "]" -> l, object = "{" listOf('key_value'):l "}" -> { var obj = {}; for (var i = 0; i < l.length; i++) obj[l[i][0]] = l[i][1]; obj } } JSON.intOfHexDigit = function(x) { return "0123456789abcdef".indexOf(x.toLowerCase()); }; JSON.matchAll('{"true\\n\\"\\u00a5": true, "foo": 42}', 'value')