improve conditional folding logic in regen/regcharclass.pl
[perl.git] / regen / regcharclass.pl
index f9d2da4..282f700 100755 (executable)
@@ -213,18 +213,23 @@ sub __clean {
     #       ( (cond1) ? ( (cond2) ? X : Y ) : Y )
     # into
     #       ( ( (cond1) && (cond2) ) ? X : Y )
-    #
+    # Also similarly handles expressions like:
+    #       : (cond1) ? ( (cond2) ? X : Y ) : Y )
+    # Note the inclusion of the close paren in ([:()]) and the open paren in ([()]) is
+    # purely to ensure we have a balanced set of parens in the expression which makes
+    # it easier to understand the pattern in an editor that understands paren's, we do
+    # not expect either of these cases to actually fire. - Yves
     1 while $expr =~ s/
-        \(  \s*
+        ([:()])  \s*
             ($parens) \s*
             \? \s*
                 \( \s* ($parens) \s*
-                    \? \s* ($parens|[^()?:]+?) \s*
-                    :  \s* ($parens|[^()?:]+?) \s*
+                    \? \s* ($parens|[^()?:\s]+?) \s*
+                    :  \s* ($parens|[^()?:\s]+?) \s*
                 \) \s*
-            : \s* \4 \s*
-        \)
-    /( ( $1 && $2 ) ? $3 : $4 )/gx;
+            : \s* \5 \s*
+        ([()])
+    /$1 ( $2 && $3 ) ? $4 : $5 $6/gx;
 
     return $expr;
 }