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
--
__________________
:(){ :|:& };: