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 <simon.proc...@gmail.com> 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, <pproca...@gmail.com> 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
>> --
>> __________________
>>
>> :(){ :|:& };:
>>
>

Reply via email to