← All programs · Grammars and match trees
Grammars and match trees #4
Raku++ 4.0.1 prints exactly what Rakudo 2026.08 prints
This is valid Raku: Rakudo 2026.08, the reference compiler, runs it without complaint, and the two outputs match character for character.
The program
The grammar and its inputs come first. rm-dump, the same in every program of this topic, prints one line for every field of every node of the resulting Match — its text, position, .orig, .prematch, .made, its captures — so a difference in the shape of the match shows as a difference in output.
my token r0 { \w+ }
my regex r1 { [ <r0> ] [ 'a' 'x' || 'a' <k1=&r0> ] }
my token r2 { <r1> <r1> <&r0> <k1=&r1> 'a' }
my rule r3 { [ <r2> <r2> ] }
sub rm-q($v) { $v.defined ?? $v.raku !! 'Nil' }
sub rm-dump($m, Str $p) {
unless $m.defined { say "$p kind Nil"; return }
if $m ~~ Match {
say "$p kind Match";
say "$p str {$m.Str.raku}";
say "$p from {$m.from}";
say "$p to {$m.to}";
say "$p orig {rm-q($m.orig)}";
say "$p target {rm-q($m.target)}";
say "$p pre {rm-q($m.prematch)}";
say "$p post {rm-q($m.postmatch)}";
say "$p made {rm-q($m.made)}";
for $m.list.kv -> $i, $c { rm-dump($c, $p ~ '[' ~ $i ~ ']') }
for $m.hash.keys.sort -> $k { rm-dump($m.hash{$k}, $p ~ '<' ~ $k ~ '>') }
# Captures that start at the same position have no specified order
# (rakupp's varies from run to run), so ties are ordered by name.
say "$p caps {$m.caps.sort({ .value.from, ~.key }).map({ .key ~ '=' ~ .value.Str.raku }).join(' ')}";
}
elsif $m ~~ Positional {
say "$p kind List({$m.elems})";
for $m.list.kv -> $i, $c { rm-dump($c, $p ~ '.' ~ $i) }
}
else { say "$p kind {$m.^name}" }
}
my @inputs = "2a1ax>a a21a1_ab2a2a", "12ax>>>a a2aa1a", "_b0ax>>a aaa10a";
for @inputs.kv -> $i, $in {
say "#$i input {$in.raku}";
if $in ~~ / :ratchet <&r1> '>'+? <r3> <r2> [ <r2> <r0> | <r2> ] <r2>? / { rm-dump($/, '@' ~ $i) }
else { say '@' ~ $i ~ ' kind Nil' }
}
Run executes the program in your browser, with the Raku++ build this site ships. Edit it and try variations.
What each compiler printed
| Rakudo 2026.08 | Raku++ 4.0.1 | |
|---|---|---|
input "2a1ax>a a21a1_ab2a2a" | ||
$/ kind | Nil | Nil |
input "12ax>>>a a2aa1a" | ||
$/ kind | Nil | Nil |
input "_b0ax>>a aaa10a" | ||
$/ kind | Nil | Nil |
grammars-v1 · seed 43 · recorded 2026-09-23 with Rakudo 2026.08 and Raku++ 4.0.1-132-g3e242220-modified · Source on GitHub ↗