Hey all,

Firstly, I want to thank everyone for all their responses.  It helped
greatly.

I wanted to share what I ended up with that seems to be working. (below)
I'm open to suggestions on how to improve this, tidy things up a bit, etc.

Running on the below grammar yields the following what to me seems perfect:

% raku ./test2.raku < test.data
{objectKey => {a => 1234, anotherObjectKey => {b => "45934"}, b => 5345,
newobjectKey => {a => 1534, b => "asdf"}}}

Thanks all for taking the time to respond.
~Paul


---- data ----
objectKey:
{
        a = 1234;
        b = 5345;

        newobjectKey:
        {
                a = 1534;
                b = "asdf";
        }

        anotherObjectKey:
        {
                b = "45934";
        }
}
---- end data ----


----- logic -----
grammar Test {

        rule TOP        { <object>                 }
        rule object     { <objectKey> <objectBody> }
        rule objectKey  { <cstr> ':'               }
        rule objectBody { '{' ~ '}' <item>+        }
        rule pair       { <cstr> '=' <value> ';'   }
        token cstr      { <alpha>+                 }
        token number    { <[0..9]>+                }
        token string    { '"' ~ '"' <-["]>+        }

        proto token item                { * };
              token item:sym<object>    { <object> }
              token item:sym<pair>      { <pair> }

        proto token value               { * };
              token value:sym<number>   { <number> }
              token value:sym<string>   { <string> }
}

class TestActions {

        method TOP($/) { make $<object>.made; }
        method object($/) { make $<objectKey>.made => $<objectBody>.made; }
        method objectBody($/) { make $<item>>>.made.hash.item; }
        method pair($/) { make $<cstr>.made => $<value>.made; }
        method objectKey($/)         { make $<cstr>.made; }
        method cstr($/)              { make ~$/; }
        method string($/)            { make ~$/; }
        method number($/)            { make ~$/; }

        method item:sym<pair>($/)    { make $<pair>.made; }
        method item:sym<object>($/)  { make $<object>.made; }
        method value:sym<number>($/) { make ~$/; }
        method value:sym<string>($/) { make ~$/; }
}
----- end logic -----

On Sun, Dec 26, 2021 at 1:01 AM 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