Hi Raymond, Wow that's exciting! I'm sure others will chime in with
their thoughts.

I wrote two more test cases for your "incremental P5-like parser",
that can be appended to the code you posted yesterday (personally I
think of incremental matching as being important for matching the
linear order of words in a string). One thing I've noticed is the
tests don't necessarily return in the order in which they appear in
the code. (Hence the short textual descriptions, to disambiguate).
Cheers, Bill.

####

# test linear order of words in a string
# (whitespace separated)

my $test1 = "      dewey defeats truman ";
my $mp1 = MatchProxy.new: subject => $test1;

#note below: per Raymond Dresens' example,
#use "die if" to test against "willnotmatch" strings

die unless $mp1 ~~~ / \s+ /;
die unless $mp1 ~~~ / dewey \s+/;
die unless $mp1 ~~~ / defeats \s+ /;
die unless $mp1 ~~~ / truman \s+ /;

say "published headline (nchar)= " ~ $mp1.P; # yields "27"


my $test2 = "      truman defeats dewey ";
my $mp2 = MatchProxy.new: subject => $test2;

#note below: per Raymond Dresens' example,
#use "die if" to test against "willnotmatch" strings

die unless $mp2 ~~~ / \s+ /;
die unless $mp2 ~~~ / dewey \s+/;  # Dies here
die unless $mp2 ~~~ / defeats \s+ /;
die unless $mp2 ~~~ / truman \s+ /;

say "actual election result (nchar)= " ~ $mp2.P; # Dies trying to match "dewey"

####



On Tue, Aug 20, 2019 at 12:00 PM Raymond Dresens
<raymond.dres...@gmail.com> wrote:
>
> Hello everyone, and thanks everyone for their comments and code snippets with 
> full of syntax that I haven't discovered as of yet,
>
> Today I managed to figure out how my provided example code could be rewritten 
> in Perl 6 almost 'verbatim': see the program below in this message. I 
> implemented a '~~~' operator; overloading '~~' or implementing '=~' was 
> problematic ;) see the comments in the code below. Any insights or 'tricks 
> around this' are of course welcome...
>
> ...apart from the question if it is possible to plug this/my "apropos" or 
> "apos" kind of approach into the regex system by implementing my own 
> adverb-kind-of-extension thing? Like: adding "apos" alongside ("pos" an 
> "continue")?
>
> Anyway: the 'MatchProxy' class seems to enable me to easily rewrite my 
> various 'incremental Perl 5 parsers' that I've concocted in the past, but my 
> next step will be diving into grammars. My 'incremental parsers' are actually 
> mostly "if ... elsif ... elsif ... else { die 'parser error' }" trees in a 
> while loop with a 'charsLeft'-check (see the class below) as its condition. 
> "tree switching" (or: "mode switching") can be done by logic intermingled 
> with (and steered by) the "tokenization process". This allows me to "shift 
> languages/syntaxes", to to speak, possibly steered by kind-of 
> preprocessor-like directives.
>
> Perhaps I shouldn't ask this (I should dive into grammars first).... but I 
> was semi-aware of the fact that I could insert code inside Perl 6 regexes, 
> but mainly in order to interpolate those "evaluation results" into the 
> regex... but using that for control flow in grammars, controlling the class 
> that processes the tokens, is that possible/wise?
>
> I hope to find out soon. ;)
>
> Regards,
>
> Raymond
>
>
> #!/usr/bin/env perl6
>
> # 
> ..............................................................................
>
> use v6.d;
>
> class MatchProxy
> {
>     has $.P is rw = 0;
>     has $.matches is rw;
>     has $.subject;
>
>     method apropos(Regex $rx)
>     {
>         if ($.subject ~~ m:pos($.P)/ $0 = $rx /)
>         {
>             $.matches = $/[0]; $.P = $/.pos
>         }
>     }
>
>     method charsLeft
>     {
>         $.P < $.matches.chars
>     }
> }
>
> # Overloading '~~' is not possible: ``Cannot override infix operator '~~', as
> # it is a special form handled directly by the compiler'', and...
>
> # Overloading/implementing '=~' //seems// possible... but using it seems
> # prohibited: ``Unsupported use of =~ to do pattern matching; in Perl 6
> # please use ~~'', so...
>
> sub infix:<~~~>(MatchProxy $mp, Regex $rx)
> {
>     $mp.apropos: $rx
> }
>
>
>
> my $test = "      foo bar";
>
> my $mp = MatchProxy.new: subject => $test;
>
> # The '^' and '\G' zero-width assertions e.g. anchors from my Perl 5 snippet
> # are removed since they aren't needed any more in this rewrite.
>
> die unless $mp ~~~ / \s+ /;
>
> die unless $mp ~~~ / foo \s+/;
>
> die if     $mp ~~~ / willnotmatch /;
>
> die unless $mp ~~~ / bar /;
>
> say $mp.P; # yields "13"
>
> # 
> ..............................................................................
>
> On Tue, 20 Aug 2019 at 01:13, William Michels <w...@caa.columbia.edu> wrote:
>>
>> Thanks to Brad Gilbert's code contribution in this thread, I re-wrote
>> a small snippet of his code (code that incrementally checks a series
>> of regex matches), to have it return the last position of each match.
>> Testing with three 'matches' and one 'willnotmatch' returns three
>> positional values, as expected:
>>
>> use v6
>>   my $test = "      foo bar";
>>
>> sub foo($x) {
>>   state @a = 0;
>>     $x ~~ m /^\s+  {@a.push($/.pos)}/;
>>     $x ~~ m :pos(@a[*-1]) /foo\s+  {@a.push($/.pos)}/;
>>     $x ~~ m :pos(@a[*-1]) /willnotmatch  {@a.push($/.pos)}/;
>>     $x ~~ m :pos(@a[*-1]) /bar   {@a.push($/.pos)}/;
>>   return @a[1 .. *];
>> }
>>
>>   #say foo($test); # returns (6 10 13)
>>   put foo($test); # returns 6 10 13
>>
>>
>> I'm actually pleasantly surprised that I can add a dozen or so
>> 'willnotmatch' lines, and it doesn't screw up the result. The next
>> step might be to 1). pull the individual regexes out into an object
>> (as suggested in the SO post below) to simplify each smartmatch line,
>> and/or 2). store the results in a hash (instead of an array), for
>> later substring extraction. But at this point it seems I'm getting
>> into 'Grammar' territory, so that might be the better approach.
>>
>> HTH, Bill.
>>
>> https://stackoverflow.com/questions/50829126/perl6-interpolate-array-in-match-for-and-or-not-functions/50838441#50838441
>>
>>
>>
>>
>>
>>
>>
>>
>> On Mon, Aug 19, 2019 at 1:08 AM Patrick Spek via perl6-users
>> <perl6-us...@perl.org> wrote:
>> >
>> > On Sun, 18 Aug 2019 13:45:27 -0300
>> > Aureliano Guedes <guedes.aureli...@gmail.com> wrote:
>> >
>> > > Even being another language, Perl6 should be inheriting Perl5's
>> > > regexes or even improving it not making it uglier and harder.
>> > >
>> > > Or I'm seeing how to use it in an easy way. Also, dunno if there is
>> > > some GOOD documentation to Perl6 regexes.
>> >
>> > Beauty is in the eye of the beholder. While I'm much more proficient
>> > with PCRE than P6CRE, I do find the Perl 6 variants to be much cleaner
>> > and easier to understand when reading regexes of others.
>> >
>> > If you find that there's a lack of documentation explaining things
>> > clearly to you, that'd be an issue to solve in the documentation. This
>> > takes a lot of effort, and if you would be so kind as to improve it
>> > where you think it's needed, it would be a great help to everyone (we
>> > can't really see how or where you're looking for what, after all).
>> >
>> > --
>> > With kind regards,
>> >
>> > Patrick Spek
>> >
>> >
>> > www:  https://www.tyil.nl/
>> > mail: p.s...@tyil.nl
>> > pgp:  1660 F6A2 DFA7 5347 322A  4DC0 7A6A C285 E2D9 8827
>> >
>> > social: https://soc.fglt.nl/tyil
>> > git:    https://gitlab.com/tyil/

Reply via email to