in reply to Re: Re: Re: Re: Re: Flattening REs into opcodes for Perl 6
in thread Flattening REs into opcodes for Perl 6

Sorry, one more thing. :^)

Angel Faus and I were discussing the best way to handle multiple backtracking thingies in the same regexp without one backtracking thingie trying to use another's index. I suggested pushing a mark (a special value, probably -1) onto the stack; if rePopindex popped a mark, it will have 'failed', and thus it would jump to the address given as its parameter. That would work something like this:

RE: #set up flags and stuff branch $start $advance: rePopindex reAdvance $fail $start: reLiteral "f", $advance rePushindex rePushmark $findo: rePushindex reLiteral "o", $findbar branch $findo $backo: rePopindex $advance $findbar: reLiteral "o", $backo set I0, 1 reFinished $fail: set I0, 0 reFinished
Angel suggested that when we push an address onto the stack, we give it a label as a parameter; if a matching operation fails, it pops an index/label pair off the stack, sets the index and jumps to the label. Something like this:
RE: #set up flags and stuff reOnfail $fail #if there's nothing left on the stack branch $start $advance: reAdvance $start: rePushindex $advance reLiteral "f" $findo: rePushindex $findbar reLiteral "o" branch $findo $findbar: reLiteral "bar" set I0, 1 reFinished $fail: set I0, 0 reFinished
Can you give me any guidance about which will work better in the long run? Angel's idea has ease-of-code-generation and code compactness going for it; mine has explicitness (for debugging) and flexibility. From what I can tell, alternation will be a bitch with either, but mine should be easier; same with optional constructs and lookaheads, from what I can see. (Of course, I could just be blinded because one is my idea and the other is someone else's; that's why I'm asking you.)

Thank you for helping me out with this. Discussing it with an expert has made this a hundred times better than it was.

=cut
--Brent Dax
There is no sig.

Replies are listed 'Best First'.
Re: (7) Flattening REs into opcodes for Perl 6
by japhy (Canon) on Nov 07, 2001 at 18:52 UTC
    I'm not sure I can say which is better. It took me a minute to grok the whole thing, but now that I do, I can see how your explicit code can be easier to use in the long run. So I guess that was just my answer.

    _____________________________________________________
    Jeff[japhy]Pinyan: Perl, regex, and perl hacker.
    s++=END;++y(;-P)}y js++=;shajsj<++y(p-q)}?print:??;