@@ -75,17 +75,21 @@ class QRegex::P6Regex::Actions is HLL::Actions {
75
75
76
76
method quantified_atom ($/ ) {
77
77
my $ qast := $ < atom > . ast;
78
- my $ sig := $ < sigmaybe > . ast;
79
- $ qast := QAST ::Regex. new (: rxtype<concat >, $ qast , $ sig ) if $ sig ;
80
- if $ < quantifier > {
78
+ my $ quant := $ < quantifier > ;
79
+ if $ quant {
81
80
$/ . CURSOR. panic(' Quantifier quantifies nothing' )
82
81
unless $ qast ;
83
- my $ ast := $ < quantifier > [0 ]. ast;
82
+
83
+ # Always capture sigspace before quantifier
84
+ my $ sig := $ < sigmaybe > . ast if $ < sigmaybe > ;
85
+ $ qast := QAST ::Regex. new (: rxtype<concat >, $ qast , $ sig ) if $ sig ;
86
+
87
+ my $ ast := $ quant [0 ]. ast;
84
88
$ ast . unshift ($ qast );
85
89
$ qast := $ ast ;
86
90
}
87
91
if $ < separator > {
88
- unless $ qast . rxtype eq ' quant' || $ < sigfinal > {
92
+ unless $ qast . rxtype eq ' quant' {
89
93
$/ . CURSOR. panic(" '" ~ $ < separator > [0 ]<septype > ~
90
94
" ' many only be used immediately following a quantifier" )
91
95
}
@@ -95,11 +99,19 @@ class QRegex::P6Regex::Actions is HLL::Actions {
95
99
QAST ::Regex. new ( : rxtype<quant >, : min (0 ), : max (1 ), $ < separator > [0 ]. ast ));
96
100
}
97
101
}
102
+ # Don't capture trailing sigspace in a $<var> = binding
103
+ unless $ * VARDEF {
104
+ my $ sig ;
105
+ if $ quant {
106
+ $ sig := $ < sigfinal > [0 ]. ast if $ < sigfinal > ;
107
+ } else {
108
+ $ sig := $ < sigmaybe > . ast if $ < sigmaybe > ;
109
+ }
110
+ $ qast := QAST ::Regex. new (: rxtype<concat >, $ qast , $ sig ) if $ sig && $ qast ;
111
+ }
98
112
if $ qast {
99
- my $ finalsig := $ < sigfinal > [0 ]. ast if $ < quantifier > ;
100
- $ qast := QAST ::Regex. new (: rxtype<concat >, $ qast , $ finalsig ) if $ finalsig && ! $ sig ;
101
113
$ qast . backtrack(' r' ) if ! $ qast . backtrack && (% * RX <r > || $ < backmod > && ~ $ < backmod > [0 ] eq ' :' );
102
- $ qast . node($/ ) if $ qast ;
114
+ $ qast . node($/ );
103
115
}
104
116
make $ qast ;
105
117
}
0 commit comments