Skip to content

Commit 952fc3c

Browse files
committed
enable captures in assertions
Like: /<foo=[bar]>/ or /<foo=:Letter>/
1 parent fd0ae90 commit 952fc3c

File tree

6 files changed

+36
-18
lines changed

6 files changed

+36
-18
lines changed

src/NQP/Actions.nqp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,8 +1771,14 @@ class NQP::RegexActions is QRegex::P6Regex::Actions {
17711771
my $name := ~$<longname>;
17721772
my $qast;
17731773
if $<assertion> {
1774-
$qast := $<assertion>[0].ast;
1775-
self.subrule_alias($qast, $name);
1774+
$qast := $<assertion>.ast;
1775+
if $qast.rxtype eq 'subrule' {
1776+
self.subrule_alias($qast, $name);
1777+
}
1778+
else {
1779+
$qast := QAST::Regex.new( $qast, :name($name),
1780+
:rxtype<subcapture>, :node($/) );
1781+
}
17761782
}
17771783
elsif $name eq 'sym' {
17781784
my str $fullrxname := %*RX<name>;
@@ -1800,12 +1806,12 @@ class NQP::RegexActions is QRegex::P6Regex::Actions {
18001806
:node($/), :name($name),
18011807
QAST::Node.new( QAST::SVal.new( :value($name) ) ) );
18021808
if $<arglist> {
1803-
for $<arglist>[0].ast.list { $qast[0].push( $_ ) }
1809+
for $<arglist>.ast.list { $qast[0].push( $_ ) }
18041810
}
18051811
elsif $<nibbler> {
18061812
$name eq 'after' ??
1807-
$qast[0].push(self.qbuildsub(self.flip_ast($<nibbler>[0].ast), :anon(1), :addself(1))) !!
1808-
$qast[0].push(self.qbuildsub($<nibbler>[0].ast, :anon(1), :addself(1)));
1813+
$qast[0].push(self.qbuildsub(self.flip_ast($<nibbler>.ast), :anon(1), :addself(1))) !!
1814+
$qast[0].push(self.qbuildsub($<nibbler>.ast, :anon(1), :addself(1)));
18091815
}
18101816
}
18111817
make $qast;

src/NQP/Grammar.nqp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -857,7 +857,7 @@ grammar NQP::Regex is QRegex::P6Regex::Grammar {
857857
| ':' <arglist>
858858
| '(' <arglist> ')'
859859
| <.normspace> <nibbler>
860-
]**0..1
860+
]?
861861
}
862862

863863
token assertion:sym<var> {

src/QRegex/P5Regex/Actions.nqp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -601,8 +601,14 @@ class QRegex::P5Regex::Actions is HLL::Actions {
601601
my $name := ~$<longname>;
602602
my $qast;
603603
if $<assertion> {
604-
$qast := $<assertion>[0].ast;
605-
self.subrule_alias($qast, $name);
604+
$qast := $<assertion>.ast;
605+
if $qast.rxtype eq 'subrule' {
606+
self.subrule_alias($qast, $name);
607+
}
608+
else {
609+
$qast := QAST::Regex.new( $qast, :name($name),
610+
:rxtype<subcapture>, :node($/) );
611+
}
606612
}
607613
elsif $name eq 'sym' {
608614
my $loc := nqp::index(%*RX<name>, ':sym<');
@@ -618,12 +624,12 @@ class QRegex::P5Regex::Actions is HLL::Actions {
618624
:node($/), :name($name),
619625
QAST::Node.new(QAST::SVal.new( :value($name) )));
620626
if $<arglist> {
621-
for $<arglist>[0].ast.list { $qast[0].push( $_ ) }
627+
for $<arglist>.ast.list { $qast[0].push( $_ ) }
622628
}
623629
elsif $<nibbler> {
624630
$name eq 'after' ??
625-
$qast[0].push(self.qbuildsub(self.flip_ast($<nibbler>[0].ast), :anon(1), :addself(1))) !!
626-
$qast[0].push(self.qbuildsub($<nibbler>[0].ast, :anon(1), :addself(1)));
631+
$qast[0].push(self.qbuildsub(self.flip_ast($<nibbler>.ast), :anon(1), :addself(1))) !!
632+
$qast[0].push(self.qbuildsub($<nibbler>.ast, :anon(1), :addself(1)));
627633
}
628634
}
629635
make $qast;

src/QRegex/P5Regex/Grammar.nqp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,6 @@ grammar QRegex::P5Regex::Grammar is HLL::Grammar {
252252
| ':' <arglist>
253253
| '(' <arglist> ')'
254254
| <.normspace> <nibbler>
255-
]**0..1
255+
]?
256256
}
257257
}

src/QRegex/P6Regex/Actions.nqp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -487,8 +487,14 @@ class QRegex::P6Regex::Actions is HLL::Actions {
487487
my $name := ~$<longname>;
488488
my $qast;
489489
if $<assertion> {
490-
$qast := $<assertion>[0].ast;
491-
self.subrule_alias($qast, $name);
490+
$qast := $<assertion>.ast;
491+
if $qast.rxtype eq 'subrule' {
492+
self.subrule_alias($qast, $name);
493+
}
494+
else {
495+
$qast := QAST::Regex.new( $qast, :name($name),
496+
:rxtype<subcapture>, :node($/) );
497+
}
492498
}
493499
elsif $name eq 'sym' {
494500
my $rxname := "";
@@ -515,12 +521,12 @@ class QRegex::P6Regex::Actions is HLL::Actions {
515521
:node($/), :name($name),
516522
QAST::Node.new(QAST::SVal.new( :value($name) )));
517523
if $<arglist> {
518-
for $<arglist>[0].ast.list { $qast[0].push( $_ ) }
524+
for $<arglist>.ast.list { $qast[0].push( $_ ) }
519525
}
520526
elsif $<nibbler> {
521527
$name eq 'after' ??
522-
$qast[0].push(self.qbuildsub(self.flip_ast($<nibbler>[0].ast), :anon(1), :addself(1))) !!
523-
$qast[0].push(self.qbuildsub($<nibbler>[0].ast, :anon(1), :addself(1)));
528+
$qast[0].push(self.qbuildsub(self.flip_ast($<nibbler>.ast), :anon(1), :addself(1))) !!
529+
$qast[0].push(self.qbuildsub($<nibbler>.ast, :anon(1), :addself(1)));
524530
}
525531
}
526532
make $qast;

src/QRegex/P6Regex/Grammar.nqp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ grammar QRegex::P6Regex::Grammar is HLL::Grammar {
333333
| ':' <arglist>
334334
| '(' <arglist> ')'
335335
| <.normspace> <nibbler>
336-
]**0..1
336+
]?
337337
}
338338

339339
token assertion:sym<[> { <?before '['|'+'|'-'|':'> <cclass_elem>+ }

0 commit comments

Comments
 (0)