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