- Timestamp:
- 08/17/08 22:51:03 (3 months ago)
- Files:
-
- 1 modified
-
src/perl6/gimme5 (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/perl6/gimme5
r21901 r21926 1663 1663 $text =~ s/\.\./-/g; 1664 1664 $text =~ s/^-\[/[^/; 1665 $text = "(?<=$text)" if $REV; 1665 1666 if ($$self{i}) { 1666 $self->bind("\$C->_PATTERN $REV(qr/\\G(?i:$text)/)");1667 $self->bind("\$C->_PATTERN(qr/\\G(?i:$text)/)"); 1667 1668 } 1668 1669 else { 1669 $self->bind("\$C->_PATTERN $REV(qr/\\G$text/)");1670 $self->bind("\$C->_PATTERN(qr/\\G$text/)"); 1670 1671 } 1671 1672 } … … 2106 2107 my $atom = $$self{atom}->walk(@_); 2107 2108 if ($q) { 2108 if ($atom =~ s{ ^ \$C->_PATTERN\(qr/\\G(.*?)/\) $ }{(?:$1)}sx) { 2109 if ($atom =~ m{ ^ \$C->_PATTERN\(qr/\\G(.*?)/\) $ }sx ) { 2110 my $a = "(?:$1)"; 2109 2111 my ($qfer,$how,$rest) = @{$$self{quant}}; 2110 2112 my $h = $how eq '!' ? '' : 2111 2113 $how eq '?' ? '?' : 2112 2114 '+'; 2113 if ($qfer eq '**') { 2115 if ($how eq '?' or $REV) { 2116 ; 2117 } 2118 elsif ($qfer eq '**') { 2114 2119 $h = $how eq '!' ? 'g' : 2115 2120 $how eq '?' ? 'f' : … … 2131 2136 } 2132 2137 $quant = "\$C->$rep$h( $rest, "; 2133 $result =$quant . "sub { my \$C=shift;\n" . ::indent($atom) . "\n})";2138 return $quant . "sub { my \$C=shift;\n" . ::indent($atom) . "\n})"; 2134 2139 } 2135 2140 else { 2136 2141 $PURE = 0; 2137 $result = "\$C->_PATTERN\(qr/\\G($atom$qfer$h)/\)";2142 return "\$C->_PATTERN\(qr/\\G($a$qfer$h)/\)"; 2138 2143 } 2139 2144 } 2140 else { 2141 my ($qfer,$how,$rest) = @{$$self{quant}}; 2142 my $h = $how eq '!' ? 'g' : 2143 $how eq '?' ? 'f' : 2144 'r'; 2145 if ($qfer eq '*') { 2146 $PURE = 0; 2147 $quant = "\$C->_STAR$h$REV("; 2148 } 2149 elsif ($qfer eq '+') { 2150 $quant = "\$C->_PLUS$h$REV("; 2151 } 2152 elsif ($qfer eq '?') { 2153 $PURE = 0; 2154 $quant = "\$C->_OPT$h$REV("; 2155 } 2156 elsif ($qfer eq '**') { 2157 if (ref $rest) { 2158 if (ref $rest eq "RE_block") { 2159 $PURE = 0; 2160 $rep = "_REPINDIRECT$REV"; 2161 $rest = $rest->walk(); 2162 } 2163 else { 2164 $rep = "_REPSEP$REV"; 2165 $rest = " sub { my \$C=shift;\n" . ::indent($rest->walk()) . "\n}"; 2166 } 2145 2146 my ($qfer,$how,$rest) = @{$$self{quant}}; 2147 my $h = $how eq '!' ? 'g' : 2148 $how eq '?' ? 'f' : 2149 'r'; 2150 if ($qfer eq '*') { 2151 $PURE = 0; 2152 $quant = "\$C->_STAR$h$REV("; 2153 } 2154 elsif ($qfer eq '+') { 2155 $quant = "\$C->_PLUS$h$REV("; 2156 } 2157 elsif ($qfer eq '?') { 2158 $PURE = 0; 2159 $quant = "\$C->_OPT$h$REV("; 2160 } 2161 elsif ($qfer eq '**') { 2162 if (ref $rest) { 2163 if (ref $rest eq "RE_block") { 2164 $PURE = 0; 2165 $rep = "_REPINDIRECT$REV"; 2166 $rest = $rest->walk(); 2167 2167 } 2168 2168 else { 2169 $ PURE = 0 if $rest =~ /^0/;2170 $rest = " '$rest'";2169 $rep = "_REPSEP$REV"; 2170 $rest = " sub { my \$C=shift;\n" . ::indent($rest->walk()) . "\n}"; 2171 2171 } 2172 $quant = "\$C->$rep$h( $rest, ";2173 2172 } 2174 $result = $quant . "sub { my \$C=shift;\n" . ::indent($atom) . "\n})"; 2173 else { 2174 $PURE = 0 if $rest =~ /^0/; 2175 $rest = "'$rest'"; 2176 } 2177 $quant = "\$C->$rep$h( $rest, "; 2175 2178 } 2179 return $quant . "sub { my \$C=shift;\n" . ::indent($atom) . "\n})"; 2176 2180 } 2177 2181 else { 2178 $result =$atom;2182 return $atom; 2179 2183 } 2180 2184 } 2181 2185 else { 2182 $result ='"' . $$self{atom} . '"';2186 return '"' . $$self{atom} . '"'; 2183 2187 } 2184 2188 $result;
