I'm on mobile, but without checking, I think the problem is here
rule pairlist { <pair> * % \; }
Specifically it's the missing %
rule pairlist { <pair> * %% \; }
JSON doesn't allow trailing commas or semicolons, so JSON::Tiny uses just %.
Your data does have trailing semicolons, so you want to use %% instead.
Also why did you change <object>, without actually changing anything?
On Sun, Dec 26, 2021, 3:22 AM Simon Proctor <[email protected]> wrote:
> Still waking up but I think the issue is your pairlist has a semi colon
> divider but this should be after each pair.
>
> So the trailing semi colon after b is causing it to fail.
>
> On Sun, 26 Dec 2021, 06:01 Paul Procacci, <[email protected]> wrote:
>
>> Hey all,
>>
>> Twas the night of Christmas, when all through the house, not a creature
>> was stirring except Paul w/ his mouse.
>>
>> Hope everyone had a Merry Christmas and takes likings to corny opening
>> statements. ;)
>>
>> I was writing a little something tonight using Grammars and ran into
>> something that I can't seem to wrap my head around. I'm hoping someone
>> could explain in detail.
>>
>> Given the following data:
>> ---- data -----
>> objectKey:
>> {
>> a = "bi";
>> b = "hi";
>> }
>> ---- end data -----
>>
>>
>> .... and the following logic partially taken from JSON::Tiny:
>>
>> ---- code ----
>> grammar myTest {
>> token TOP { \s* <object> \s* }
>> rule object { <objectKey> '{' <pairlist> '}' }
>> # rule object { <objectKey> '{' ~ '}' <pairlist> }
>> rule objectKey { <cstr> ':' }
>> rule pairlist { <pair> * % \; }
>> rule pair { <cstr> '=' <value> }
>> token cstr { <alpha>+ }
>> token value { '"' ~ '"' <alpha>* }
>> }
>>
>> class myTestActions {
>> method TOP($/) {
>> make $<pairlist>.made.hash.item;
>> }
>>
>> method object($/) {
>> say 'hello';
>> }
>>
>> method objectKey($/) {
>> make $<cstr>.made;
>> }l
>> method pairlist($/) {
>> make $<pair>>>.made.flat;
>> }
>>
>> method pair($/) {
>> make $<cstr>.made => $<value>.made;
>> }
>>
>> method cstr($/) { make ~$/ }
>> method value($/) { make ~$/ }
>> }
>> ---- code ----
>>
>>
>> ... it'd be my hopes that this would match. However, It's not matching
>> on 'object' and I can't seem to figure out why.
>>
>> Adding Grammar::Tracer yields the following:
>>
>> TOP
>> | object
>> | | objectKey
>> | | | cstr
>> | | | * MATCH "objectKey"
>> | | * MATCH "objectKey:\n"
>> | | pairlist
>> | | | pair
>> | | | | cstr
>> | | | | * MATCH "a"
>> | | | | value
>> | | | | * MATCH "\"bi\""
>> | | | * MATCH "a = \"bi\""
>> | | | pair
>> | | | | cstr
>> | | | | * MATCH "b"
>> | | | | value
>> | | | | * MATCH "\"hi\""
>> | | | * MATCH "b = \"hi\""
>> | | | pair
>> | | | | cstr
>> | | | | * FAIL
>> | | | * FAIL
>> | | * MATCH "a = \"bi\";\n\tb = \"hi\""
>> | * FAIL
>> * FAIL
>>
>> What exactly am I doing wrong? Does '{' ~ '}' not work as I expect here?
>> Appreciate any insight.
>>
>> Thanks,
>> Paul
>> --
>> __________________
>>
>> :(){ :|:& };:
>>
>