On Thu, 2002-08-29 at 08:05, Ken Fox wrote:
> A question: Do rules matched in a { code } block set backtrack points for
> the outer rule? For example, are these rules equivalent?
> 
>   rule expr1 {
>     <term> { /@operators/ or fail } <term>
>   }
> 
>   rule expr2 {
>     <term> @operators <term>
>   }
> 
> And a comment: It would be nice to have procedural control over back-
> tracking so that { code } can fail, succeed (not fail), or succeed and
> commit. Right now we can follow { code } with ::, :::, etc. but that does
> not allow much control. I'm a little afraid of what happens in an LL(Inf)
> grammar if backtracking states aren't aggressively pruned.

Well, if /.../ is returning a result object (Let's say
CORE::RX::Result), then I would imagine it's an easy enough thing to let
you create your own, or return the one from a rule that you invoke.
e.g.:

    rule { <term> { /@operators/.commit(1) or fail } <term> }
    
The hypothetical commit() method being one that would take a number and
modify the result object so that it commits as if you had used that many
colons.

{} inside a rule would, I imagine be implemented like so:

    sub rxbraces ($code) {
        my $stat = $code();
        if $stat.isa(CORE::RX::Result) {
                return $stat;
        } else {
                my $r is CORE::RX::Result;
                $r.success($stat); # Boolean status-setting method
                return $r;
        }
    }

Or the moral equiv.... In other words, it should be able to return a
result of your choosing.

Sorry if I've missed some of the design. My Perl 6 pseudo-code may not
be legal.


Reply via email to