@@ -237,15 +237,31 @@ class QRegex::NFA {
237
237
method charrange ($ node , $ from , $ to ) {
238
238
my $ indent := dentin();
239
239
note (" $ indent charrange $ from -> $ to" ) if $ nfadeb ;
240
- if $ node . subtype eq ' zerowidth' {
241
- $ from := self . addedge($ from , -1 , $ EDGE_CHARRANGE + ? $ node . negate,
242
- [$ node [1 ]. value , $ node [2 ]. value ]);
243
- dentout(self . addedge($ from , 0 , $ EDGE_FATE , 0 ));
240
+ my $ base_edge := $ EDGE_CHARRANGE ;
241
+ my @ to_add ;
242
+ if $ node [0 ] eq ' ignorecase' || $ node [0 ] eq ' ignorecase+ignoremark' {
243
+ nqp :: push (@ to_add , nqp :: ord (nqp :: lc (nqp :: chr ($ node [1 ]. value ))));
244
+ nqp :: push (@ to_add , nqp :: ord (nqp :: lc (nqp :: chr ($ node [2 ]. value ))));
245
+ nqp :: push (@ to_add , nqp :: ord (nqp :: uc (nqp :: chr ($ node [1 ]. value ))));
246
+ nqp :: push (@ to_add , nqp :: ord (nqp :: uc (nqp :: chr ($ node [2 ]. value ))));
244
247
}
245
248
else {
246
- dentout(self . addedge($ from , $ to , $ EDGE_CHARRANGE + ? $ node . negate,
247
- [$ node [1 ]. value , $ node [2 ]. value ]));
249
+ nqp :: push (@ to_add , $ node [1 ]. value );
250
+ nqp :: push (@ to_add , $ node [2 ]. value );
251
+ }
252
+ my $ result ;
253
+ for @ to_add -> $ ord0 , $ ord1 {
254
+ if $ node . subtype eq ' zerowidth' {
255
+ my $ next := self . addedge($ from , -1 , $ base_edge + ? $ node . negate,
256
+ [$ ord0 , $ ord1 ]);
257
+ $ result := dentout(self . addedge($ next , 0 , $ EDGE_FATE , 0 ));
258
+ }
259
+ else {
260
+ $ result := dentout(self . addedge($ from , $ to , $ base_edge + ? $ node . negate,
261
+ [$ ord0 , $ ord1 ]));
262
+ }
248
263
}
264
+ $ result
249
265
}
250
266
251
267
method literal ($ node , $ from , $ to ) {
0 commit comments