On Thu, Jun 02, 2005 at 09:14:33AM +0200, "TSa (Thomas Sandlaß)" wrote: > Patrick R. Michaud wrote: > >Of course, there are other "implicit" parameters that are given > >to a rule -- the target string to be matched and an initial > >starting position. But I think some of those details are still > >being worked out. > > Wasn't it said that rules have the current match object/state > as invocant? I would assume that everything else can be found > through it? Actually the mnemonics that $/ is the match and > methods on $?SELF are called with ./method fits. The only > remaining thing is to define the method set of the Match class.
Alas, it doesn't seem to be quite that straightforward. Or maybe it is, and I'm just not seeing it yet. So, I'll just "think out loud" here for a bit... If the current match object/state ($/) is the invocant of the rule, then in order for rule inheritance to work properly $/ must be able to be an instance of a Grammar. A05 explicitly recognizes this possibility when it says "the state object may in fact be an instance of a grammar class". If that's the case, we might not need a separate C<Match> class, and we just place the methods needed for inspecting "match objects" into the Grammar class. But somehow my brain just has trouble accepting that applying a rule to a target returns an "instance of a Grammar". The wording seems all wrong, or perhaps I just need to adjust what I think of when I see the word "Grammar". Getting rule inheritance to work properly is a bit tricky. When confronted with something like "label: x = y + z" ~~ rx :w / (\w+) \: <Foo::expr> / we have to create at least two match objects, and if we say that the match objects are the rule invocants, then the grammar engine has to be smart enough to recognize that the match object it creates to use as the invocant of <Foo::expr> is an instance of grammar Foo. Or, perhaps Foo::expr and all rules in Foo are really constructors of some sort that build Foo objects--that seems more logical. But if we say that Foo::expr is a sub or method that constructs Foo objects (as opposed to having a pre-existing invocant), then Foo::expr needs to have the target string and starting position available to it somehow, as I mentioned in my previous message. On another topic, what do we do with rules that aren't members of a grammar? A05 says: Within a closure, C<$_> represents the current state of the current regex, and by extension, the current state of all the regexes participating in the current match. (The type of the state object is the current grammar class, which may be an anonymous type if the current grammar has no name. If the regex is not a member of a grammar, it's of type RULE.) I suspect the first sentence is out of date -- that C<$_> above is now really C<$/> (the match object). Since in the case of a bare rule we don't have a "current grammar", what can we say about the type of the state object beyond "it may be an anonymous type"? I think the state object ought to have some sort of base type -- is it Grammar? Rule? If we say it's a "Rule", then we're effectively saying that "applying a Rule to a target results in a Rule object containing the state of the match", which just sounds completely wrong to my ears/eyes (even though it may in fact be correct). Or perhaps all of this is to resolved using roles, mixins, or multiple superclasses. But to get back to my original statement that "some of the details are still being worked out", I find that A05 is somewhat speculative on many of the details of how grammars, inheritance, state objects, and rules will interact, and S05 is practically silent on the topic. So, there's definitely some work to do. And of course we have to figure out how to map all of this into what Parrot has available, or update Parrot to provide what we need to do this. :-) I'll be appreciative of any illumination that others can provide to the above, especially from @Larry. Pm