Skip to content

Instantly share code, notes, and snippets.

@FROGGS
Last active December 17, 2015 10:49
Show Gist options
  • Save FROGGS/5598019 to your computer and use it in GitHub Desktop.
Save FROGGS/5598019 to your computer and use it in GitHub Desktop.
RT117415 - patch for "Use of regex characters as substitution delimiter fails"
use Test;
plan 69;
my @delims = < ^ ° ! " § $ % @ € & / = ? ` * + ~ ' ; , . - | >;
for @delims -> $d {
ok eval("my \$x = 'abc'; \$x ~~ m{$d}b{$d}"), "$d as delimiter in ok-match";
nok eval("my \$x = 'abc'; \$x ~~ m{$d}d{$d}"), "$d as delimiter in nok-match";
is eval("my \$x = 'abc'; \$x ~~ s{$d}a{$d}b{$d}; \$x"), 'bbc', "$d as delimiter in substitution";
}
diff --git a/src/QRegex/P5Regex/Grammar.nqp b/src/QRegex/P5Regex/Grammar.nqp
index e29167b..5be2be3 100644
--- a/src/QRegex/P5Regex/Grammar.nqp
+++ b/src/QRegex/P5Regex/Grammar.nqp
@@ -69,7 +69,7 @@ grammar QRegex::P5Regex::Grammar is HLL::Grammar {
<![|)]>
<!rxstopper>
<atom>
- [ <.ws> <quantifier=p5quantifier> ]**0..1
+ [ <.ws> <!before <rxstopper> > <quantifier=p5quantifier> ]**0..1
<.ws>
}
diff --git a/src/QRegex/P6Regex/Grammar.nqp b/src/QRegex/P6Regex/Grammar.nqp
index d29ee96..d3cc529 100755
--- a/src/QRegex/P6Regex/Grammar.nqp
+++ b/src/QRegex/P6Regex/Grammar.nqp
@@ -125,12 +125,12 @@ grammar QRegex::P6Regex::Grammar is HLL::Grammar {
token termalt {
<termconj>
- [ '|' <![|]> [ { $*SEQ := 0; } <termconj> || <.throw_null_pattern> ] ]*
+ [ <!before <rxstopper> > '|' <![|]> [ { $*SEQ := 0; } <termconj> || <.throw_null_pattern> ] ]*
}
token termconj {
<termish>
- [ '&' <![&]> [ { $*SEQ := 0; } <termish> || <.throw_null_pattern> ] ]*
+ [ <!before <rxstopper> > '&' <![&]> [ { $*SEQ := 0; } <termish> || <.throw_null_pattern> ] ]*
}
token termish {
@@ -140,9 +140,10 @@ grammar QRegex::P6Regex::Grammar is HLL::Grammar {
}
token quantified_atom {
+ <!rxstopper>
<atom>
[
- <.ws> [ <quantifier> | <?before ':'> <backmod> <!alpha> ]
+ <.ws> [ <!before <rxstopper> > <quantifier> | <?before ':'> <backmod> <!alpha> ]
[ <.ws> <separator> ]**0..1
]**0..1
}
@@ -204,7 +205,7 @@ grammar QRegex::P6Regex::Grammar is HLL::Grammar {
token metachar:sym<bs> { \\ <backslash> }
token metachar:sym<mod> { <mod_internal> }
token metachar:sym<quantifier> {
- <quantifier> <.panic: 'Quantifier quantifies nothing'>
+ <!before <rxstopper> > <quantifier> <.panic: 'Quantifier quantifies nothing'>
}
## we cheat here, really should be regex_infix:sym<~>
1..69
ok 1 - ^ as delimiter in ok-match
ok 2 - ^ as delimiter in nok-match
ok 3 - ^ as delimiter in substitution
ok 4 - ° as delimiter in ok-match
ok 5 - ° as delimiter in nok-match
ok 6 - ° as delimiter in substitution
ok 7 - ! as delimiter in ok-match
ok 8 - ! as delimiter in nok-match
ok 9 - ! as delimiter in substitution
ok 10 - " as delimiter in ok-match
ok 11 - " as delimiter in nok-match
ok 12 - " as delimiter in substitution
ok 13 - § as delimiter in ok-match
ok 14 - § as delimiter in nok-match
ok 15 - § as delimiter in substitution
ok 16 - $ as delimiter in ok-match
ok 17 - $ as delimiter in nok-match
ok 18 - $ as delimiter in substitution
ok 19 - % as delimiter in ok-match
ok 20 - % as delimiter in nok-match
ok 21 - % as delimiter in substitution
ok 22 - @ as delimiter in ok-match
ok 23 - @ as delimiter in nok-match
ok 24 - @ as delimiter in substitution
ok 25 - € as delimiter in ok-match
ok 26 - € as delimiter in nok-match
ok 27 - € as delimiter in substitution
ok 28 - & as delimiter in ok-match
ok 29 - & as delimiter in nok-match
ok 30 - & as delimiter in substitution
ok 31 - / as delimiter in ok-match
ok 32 - / as delimiter in nok-match
ok 33 - / as delimiter in substitution
ok 34 - = as delimiter in ok-match
ok 35 - = as delimiter in nok-match
ok 36 - = as delimiter in substitution
ok 37 - ? as delimiter in ok-match
ok 38 - ? as delimiter in nok-match
ok 39 - ? as delimiter in substitution
ok 40 - ` as delimiter in ok-match
ok 41 - ` as delimiter in nok-match
ok 42 - ` as delimiter in substitution
ok 43 - * as delimiter in ok-match
ok 44 - * as delimiter in nok-match
ok 45 - * as delimiter in substitution
ok 46 - + as delimiter in ok-match
ok 47 - + as delimiter in nok-match
ok 48 - + as delimiter in substitution
ok 49 - ~ as delimiter in ok-match
ok 50 - ~ as delimiter in nok-match
ok 51 - ~ as delimiter in substitution
ok 52 - ' as delimiter in ok-match
ok 53 - ' as delimiter in nok-match
ok 54 - ' as delimiter in substitution
ok 55 - ; as delimiter in ok-match
ok 56 - ; as delimiter in nok-match
ok 57 - ; as delimiter in substitution
ok 58 - , as delimiter in ok-match
ok 59 - , as delimiter in nok-match
ok 60 - , as delimiter in substitution
ok 61 - . as delimiter in ok-match
ok 62 - . as delimiter in nok-match
ok 63 - . as delimiter in substitution
ok 64 - - as delimiter in ok-match
ok 65 - - as delimiter in nok-match
ok 66 - - as delimiter in substitution
ok 67 - | as delimiter in ok-match
ok 68 - | as delimiter in nok-match
ok 69 - | as delimiter in substitution
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment