Hello,

I've been chatting with raiph on SO regarding Grammar "tokens" vs
"rules". The OP is here https://stackoverflow.com/q/62051742 and our
discussion is here https://stackoverflow.com/a/62053666 .

I think there's something going on with the examples below, as I'm
seeing different results when comparing a basic "rule" match vs either
unnamed or named "rule" captures. The focus of the tests below is to
look at changes with/without whitespace, and comparing "tokens" vs
"rules".

TL;DR version:

> say $/ if 'ab'  ~~ rule  {.? .?}
「a」
> say $/ if 'ab'  ~~ rule  {(.?) (.?)}
「b」
 0 => 「b」
 1 => 「」
> say $/ if 'ab'  ~~ rule  {$<first>=.? $<second>=.?}
「b」
 first => 「b」
 second => 「」

So for the first example (an unadorned "rule" match), Raku returns 「a」.
But for the second and third examples ("rule" captures), Raku returns 「b」.
(Also confirmed the three lines above with Raku one-liners).

Full list of examples:

Last login: Thu Mar 11 11:50:11 on ttys042
user@mbook:~$ raku
Welcome to 𝐑𝐚𝐤𝐮𝐝𝐨™ v2020.10.
Implementing the 𝐑𝐚𝐤𝐮™ programming language v6.d.
Built on MoarVM version 2020.10.

To exit type 'exit' or '^D'
> say $/ if 'a'  ~~ token  {.?.?}
「a」
> say $/ if 'ab'  ~~ token  {.?.?}
「ab」
> say $/ if 'ab'  ~~ token  {.? .?}
「ab」
> say $/ if 'a b'  ~~ token  {.? .?}
「a 」
> say $/ if 'a'  ~~ rule  {.?.?}
「a」
> say $/ if 'ab'  ~~ rule  {.?.?}
「ab」
> say $/ if 'ab'  ~~ rule  {.? .?}
「a」
> say $/ if 'a b'  ~~ rule  {.? .?}
「a b」
> ####
Nil
> say $/ if 'a'  ~~ token  {(.?)(.?)}
「a」
 0 => 「a」
 1 => 「」
> say $/ if 'ab'  ~~ token  {(.?)(.?)}
「ab」
 0 => 「a」
 1 => 「b」
> say $/ if 'ab'  ~~ token  {(.?) (.?)}
「ab」
 0 => 「a」
 1 => 「b」
> say $/ if 'a b'  ~~ token  {(.?) (.?)}
「a 」
 0 => 「a」
 1 => 「 」
> say $/ if 'a'  ~~ rule  {(.?)(.?)}
「a」
 0 => 「a」
 1 => 「」
> say $/ if 'ab'  ~~ rule  {(.?)(.?)}
「ab」
 0 => 「a」
 1 => 「b」
> say $/ if 'ab'  ~~ rule  {(.?) (.?)}
「b」
 0 => 「b」
 1 => 「」
> say $/ if 'a b'  ~~ rule  {(.?) (.?)}
「a b」
 0 => 「a」
 1 => 「b」
> ####
Nil
> say $/ if 'a'  ~~ token  {$<first>=.?$<second>=.?}
「a」
 first => 「a」
 second => 「」
> say $/ if 'ab'  ~~ token  {$<first>=.?$<second>=.?}
「ab」
 first => 「a」
 second => 「b」
> say $/ if 'ab'  ~~ token  {$<first>=.? $<second>=.?}
「ab」
 first => 「a」
 second => 「b」
> say $/ if 'a b'  ~~ token  {$<first>=.? $<second>=.?}
「a 」
 first => 「a」
 second => 「 」
> say $/ if 'a'  ~~ rule  {$<first>=.?$<second>=.?}
「a」
 first => 「a」
 second => 「」
> say $/ if 'ab'  ~~ rule  {$<first>=.?$<second>=.?}
「ab」
 first => 「a」
 second => 「b」
> say $/ if 'ab'  ~~ rule  {$<first>=.? $<second>=.?}
「b」
 first => 「b」
 second => 「」
> say $/ if 'a b'  ~~ rule  {$<first>=.? $<second>=.?}
「a b」
 first => 「a」
 second => 「b」
> ####
Nil

Any advice appreciated, Thx, Bill.

Reply via email to