grammar JSON {
rule TOP {
<array> | <object>
}
proto token value { * }
token value:sym<string> { '"' .+? '"' }
token value:sym<number> { \d+[\.\d+]? }
token pair { <value:sym<string>>\h*':'\h*[<value> | <array> | <object>] }
token array {
'['\s*
[
[<value> | <array> | <object>]
[\s*','\s*[<value> | <array> | <object>]]*
]?
\s*']'
}
token object {
'{'\s*
[
<pair>
[\s*','\s*<pair>]*
]?
\s*'}'
}
}
class JSON-parse {
method TOP($/) {
make $/
}
method pair($/) {
make ($<value>[0] => $<value>[1])
}
method array($/) {
make $<value>
}
method object($/) {
make $<object>
}
#proto method value {*}
method value:sym<string>($/) {
make $/.Str
}
method value:sym<number>($/) {
make $/.Str.Num
}
}
my $c = JSON.parse: '
{
"a": 1,
"b" : 2,
"c" :[
1,
2,3],
"d": {
"e": {
"f": 5,
"g": 6
},
"h": [5, 6, 7]
}
}
'.trim, :actions(JSON-parse.new);
say $c