Legend:
- Unmodified
- Added
- Removed
-
src/perl6/STD.pm
r22508 r22532 453 453 :my $startpos = self.pos; 454 454 455 :dba<simple whitespace> 455 456 [ 456 457 | \h+ <![#\s\\]> { $¢.<_>[$¢.pos]<ws> = $startpos; } # common case … … 460 461 ] 461 462 || 463 :dba<complicated whitespace> 462 464 [ 463 465 | <.unsp> … … 585 587 586 588 token block { 587 '{' <in: '}', 'statementlist', 'block'>589 '{' ~ '}' <statementlist> 588 590 589 591 [ … … 593 595 | <.unv>? $$ <.ws> 594 596 { $¢.<_>[$¢.pos]<endstmt> = 2; } {*} #= endstmt complex 595 | { *} { $¢.<_>[$¢.pos]<endargs> = 1; }#= endargs597 | { $¢.<_>[$¢.pos]<endargs> = 1; } <.ws> {*} #= endargs 596 598 ] 597 599 } … … 619 621 | <.unv>? $$ <.ws> 620 622 { $¢.<_>[$¢.pos]<endstmt> = 2; } {*} #= endstmt complex 621 | { *} { $¢.<_>[$¢.pos]<endargs> = 1; }#= endargs623 | { $¢.<_>[$¢.pos]<endargs> = 1; } <.ws> {*} #= endargs 622 624 ] 623 625 } … … 667 669 | <statement_control> {*} #= control 668 670 | <EXPR> {*} #= expr 671 :dba<statement end> 669 672 [ 670 673 || <?{ ($¢.<_>[$¢.pos]<endstmt> // 0) == 2 }> # no mod after end-line curly 671 674 || 675 :dba<statement modifier> 672 676 [ 673 677 | <statement_mod_loop> {*} #= mod loop 674 678 | <statement_mod_cond> {*} #= mod cond 679 :dba<statement modifier loop> 675 680 [ 676 681 || <?{ ($¢.<_>[$¢.pos]<endstmt> // 0) == 2 }> … … 696 701 } 697 702 698 rule statement_control:use {\ 699 <sym> 703 token statement_control:use { 704 <sym> :s 700 705 [ 701 706 | <version> … … 709 714 710 715 711 rule statement_control:no {\ 712 <sym> 716 token statement_control:no { 717 <sym> :s 713 718 <module_name><arglist>? 714 719 } 715 720 716 721 717 rule statement_control:if {\ 718 <sym> 722 token statement_control:if { 723 <sym> :s 719 724 <xblock> 720 725 $<elsif> = ( … … 727 732 728 733 729 rule statement_control:unless {\ 730 <sym> 734 token statement_control:unless { 735 <sym> :s 731 736 <xblock> 732 737 [ <!before 'else'> || <.panic: "unless does not take \"else\" in Perl 6; please rewrite using \"if\""> ] … … 734 739 735 740 736 rule statement_control:while {\ 737 <sym> 741 token statement_control:while { 742 <sym> :s 738 743 [ <?before '(' ['my'? '$'\w+ '=']? '<' '$'?\w+ '>' ')'> #' 739 744 <.panic: "This appears to be Perl 5 code"> ]? … … 742 747 743 748 744 rule statement_control:until {\ 745 <sym> 749 token statement_control:until { 750 <sym> :s 746 751 <xblock> 747 752 } 748 753 749 754 750 rule statement_control:repeat {\ 751 <sym> 755 token statement_control:repeat { 756 <sym> :s 752 757 [ 753 758 | ('while'|'until') … … 759 764 760 765 761 rule statement_control:loop {\ 762 <sym> 766 token statement_control:loop { 767 <sym> :s 763 768 $<eee> = ( 764 769 '(' … … 772 777 773 778 774 rule statement_control:for {\ 775 <sym> 779 token statement_control:for { 780 <sym> :s 776 781 [ <?before 'my'? '$'\w+ '(' > 777 782 <.panic: "This appears to be Perl 5 code"> ]? … … 779 784 } 780 785 781 rule statement_control:given {\ 782 <sym> 786 token statement_control:given { 787 <sym> :s 783 788 <xblock> 784 789 } 785 rule statement_control:when {\ 786 <sym> 790 token statement_control:when { 791 <sym> :s 787 792 <xblock> 788 793 } … … 936 941 ] 937 942 {*} #= value 938 | '(' <in: ')', 'signature'>943 | :dba<signature> '(' ~ ')' <signature> 939 944 | <postcircumfix> 940 945 { $key = ""; $value = $<postcircumfix>; } … … 1109 1114 1110 1115 token postcircumfix:sym<( )> ( --> Methodcall) 1111 { '(' <in: ')', 'semilist', 'argument list'> }1116 { :dba<argument list> '(' ~ ')' <semilist> } 1112 1117 1113 1118 token postcircumfix:sym<[ ]> ( --> Methodcall) 1114 { '[' <in: ']', 'semilist', 'subscript'> }1119 { :dba<subscript> '[' ~ ']' <semilist> } 1115 1120 1116 1121 token postcircumfix:sym<{ }> ( --> Methodcall) 1117 { '{' <in: '}', 'semilist', 'subscript'> }1122 { :dba<subscript> '{' ~ '}' <semilist> } 1118 1123 1119 1124 token postcircumfix:sym«< >» ( --> Methodcall) … … 1140 1145 1141 1146 [ 1142 | '.'? <.unsp>? '(' <in: ')', 'semilist', 'argument list'>1147 | '.'? <.unsp>? '(' ~ ')' <semilist> 1143 1148 | ':' <?before \s> <!{ $+inquote }> <arglist> 1144 1149 ]? … … 1166 1171 <.unsp>? 1167 1172 [ 1168 | '(' <in: ')', 'signature'>1169 | '[' <in: ']', 'semilist', 'shape definition'>1170 | '{' <in: '}', 'semilist', 'shape definition'>1173 | '(' ~ ')' <signature> 1174 | :dba<shape definition> '[' ~ ']' <semilist> 1175 | :dba<shape definition> '{' ~ '}' <semilist> 1171 1176 | <?before '<'> <postcircumfix> 1172 1177 ]* … … 1289 1294 [ 1290 1295 | <variable_declarator> 1291 | '(' <in: ')', 'signature'> <trait>*1296 | '(' ~ ')' <signature> <trait>* 1292 1297 | <routine_declarator> 1293 1298 | <regex_declarator> … … 1648 1653 [ 1649 1654 | <identifier> 1650 | '(' <in: ')', 'EXPR', 'indirect name'>1655 | :dba<indirect name> '(' ~ ')' <EXPR> 1651 1656 ] 1652 1657 ]? … … 1667 1672 #token subcall { 1668 1673 # # XXX should this be sublongname? 1669 # <subshortname> <.unsp>? '.'? '(' <in: ')', 'semilist'>1674 # <subshortname> <.unsp>? '.'? '(' ~ ')' <semilist> 1670 1675 # {*} 1671 1676 #} … … 2460 2465 rule multisig { 2461 2466 [ 2462 ':'?'(' <in: ')', 'signature'>2467 ':'?'(' ~ ')' <signature> 2463 2468 ] 2464 2469 ** '|' … … 2480 2485 | <sigil> '.' 2481 2486 [ 2482 | '(' <in: ')', 'signature'>2483 | '[' <in: ']', 'signature'>2484 | '{' <in: '}', 'signature'>2487 | '(' ~ ')' <signature> 2488 | '[' ~ ']' <signature> 2489 | '{' ~ '}' <signature> 2485 2490 | <?before '<'> <postcircumfix> 2486 2491 ] … … 2545 2550 2546 2551 token sigterm { 2547 ':(' <in: ')', 'signature'>2552 ':(' ~ ')' <signature> 2548 2553 } 2549 2554 … … 2564 2569 } 2565 2570 2566 rule type_declarator:subset {\ 2567 <sym> 2571 token type_declarator:subset { 2572 <sym> :s 2568 2573 <longname> { $¢.add_type($<longname>); } 2569 2574 [ of <fulltypename> ]? … … 2772 2777 2773 2778 token circumfix:sigil ( --> Term) 2774 { <sigil> '(' <in: ')', 'semilist', 'contextualizer'> }2779 { :dba<contextualizer> <sigil> '(' ~ ')' <semilist> } 2775 2780 2776 2781 #token circumfix:typecast ( --> Term) 2777 # { <typename> '(' <in: ')', 'semilist'> }2782 # { <typename> '(' ~ ')' <semilist> } 2778 2783 2779 2784 token circumfix:sym<( )> ( --> Term) 2780 { '(' <in: ')', 'semilist', 'parenthesized expression'> }2785 { :dba<parenthesized expression> '(' ~ ')' <semilist> } 2781 2786 2782 2787 token circumfix:sym<[ ]> ( --> Term) 2783 { '[' <in: ']', 'semilist', 'array composer'> }2788 { :dba<array composer> '[' ~ ']' <semilist> } 2784 2789 2785 2790 ## methodcall … … 3168 3173 { <sym> } 3169 3174 3175 token infix:sym<...> ( --> List_infix) 3176 { <sym> } 3177 3170 3178 token term:sym<...> ( --> List_prefix) 3171 3179 { <sym> <args>? } … … 3202 3210 :my $listopish = 0; 3203 3211 [ 3204 | '.(' <in: ')', 'semilist', 'argument list'> {*} #= func args3205 | '(' <in: ')', 'semilist', 'argument list'> {*} #= func args3206 | <.unsp> '.'? '(' <in: ')', 'semilist', 'argument list'> {*} #= func args3212 | :dba<argument list> '.(' ~ ')' <semilist> {*} #= func args 3213 | :dba<argument list> '(' ~ ')' <semilist> {*} #= func args 3214 | :dba<argument list> <.unsp> '.'? '(' ~ ')' <semilist> {*} #= func args 3207 3215 | {} [<?before \s> <!{ $istype }> <.ws> <!infixstopper> <arglist> { $listopish = 1 }]? 3208 3216 ] … … 3742 3750 <!before '$$'> 3743 3751 <?before <sigil>> 3744 [:lang($¢.cursor_fresh($+LANG)) <variable>] 3745 <.ws> 3746 $<binding> = ( '=' <.ws> <quantified_atom> )? 3752 [:lang($¢.cursor_fresh($+LANG)) <variable> <.ws> ] 3753 $<binding> = ( <.ws> '=' <.ws> <quantified_atom> )? 3747 3754 { $<sym> = $<variable>.item; } 3755 } 3756 3757 token metachar:sym<~> { 3758 <sym> 3748 3759 } 3749 3760 … … 3846 3857 } 3847 3858 3848 token mod_arg { '(' <in: ')', 'semilist', 'modifier argument'> }3859 token mod_arg { :dba<modifier argument> '(' ~ ')' <semilist> } 3849 3860 3850 3861 token mod_internal:sym<:my> { ':' <?before 'my' \s > [:lang($¢.cursor_fresh($+LANG)) <statement> <eat_terminator> ] } … … 4163 4174 } 4164 4175 4165 # not quite a "between" combinator... 4166 token in (Str $stop, Str $insides, Str $name = $insides) { 4167 :my $GOAL is context = $stop; 4168 <x=$insides> $stop {{ $/.{$insides} = $<x>; $/.:delete<x> }} || <.panic: "Unable to parse $name; couldn't find final '$stop'"> 4176 method SETGOAL { } 4177 method FAILGOAL (Str $stop, Str $name) { 4178 self.panic("Unable to parse $name; couldn't find final '$stop'"); 4169 4179 } 4170 4180 -
src/perl6/gimme5
r22498 r22532 39 39 our $PURE; 40 40 our $MAYBACKTRACK; 41 our @STUFFED; 41 42 our @DECL; 42 43 our $SYM; … … 460 461 461 462 local $MAYBACKTRACK = 1; 463 $adverbs{r} = 0; 464 $adverbs{s} = 0; 465 $adverbs{dba} = $NAME; 462 466 if ($KIND eq 'token' or $KIND eq 'rule') { 463 467 $MAYBACKTRACK = 0; 468 $adverbs{r} = 1; 469 if ($KIND eq 'rule') { 470 $adverbs{s} = 1; 471 } 464 472 } 465 473 … … 924 932 925 933 sub ws { 926 return if $ KIND eq 'rule'; # meta whitespace parsed in atom934 return if $adverbs{s}; # meta whitespace parsed in atom 927 935 for (;;) { 928 936 # next if s/^(?!=[\0-~])\s+//; … … 954 962 ws(); 955 963 local $STOP = shift; 964 local %adverbs = %adverbs; 956 965 957 966 my @decl; … … 1103 1112 my $min = 0; 1104 1113 if (not $m) { 1105 if ($ KIND eq 'rule' or $KIND eq 'token') {1114 if ($adverbs{r}) { 1106 1115 $m = ':'; 1107 1116 } … … 1141 1150 sub atom { 1142 1151 here(); 1152 if (@STUFFED) { 1153 return shift @STUFFED; 1154 } 1155 # unspace 1143 1156 if (s/^\\\s/ /) { 1144 wsany(); 1145 } 1146 if (/^[\s\#]/ and $KIND eq 'rule') { 1157 panic("Attempt to quote whitespace"); 1158 } 1159 # sigspace 1160 if (/^[\s\#]/ and $adverbs{s}) { 1147 1161 wsany(); 1148 1162 return bless { name => 'ws', nobind => 1, noquant => 1, min => 0, rest => '' }, … … 1159 1173 if (/^[*+?]/) { panic "quantifier quantifies nothing"; } 1160 1174 1175 if (s/^~//) { 1176 wsany(); 1177 my $beg = length($all) - length($_); 1178 my $goal = quantified_atom(); 1179 my $end = length($all) - length($_); 1180 my $goaltext = substr($all, $beg, $end - $beg); 1181 1182 my $dba = $adverbs{dba} // $NAME; 1183 $dba =~ s/'/\\\'/g; 1184 my $failgoal = bless { name => 'FAILGOAL', rest => "($goaltext, '$dba')", min => 0, nobind => 1 }, "RE_method"; 1185 my $check = bless { zyg => [$goal, $failgoal], min => 1, %adverbs}, "RE_first"; 1186 my $checkbrack = bless({ decl => [], re => $check, min => 1 }, "RE_bracket"); 1187 1188 wsany(); 1189 1190 my $nest = quantified_atom(); 1191 1192 @STUFFED = ($nest, $checkbrack); 1193 return bless { text => '::', min => 0, extra => "local \$::GOAL = $goaltext", %adverbs }, "RE_meta"; 1194 } 1161 1195 if (s/^ (\w+) (?! \s* [*+?]) //x) { 1162 1196 my $word = $1; … … 1211 1245 my $not = $1 ne ''; 1212 1246 my $adverb = $2; 1213 local %adverbs = %adverbs; 1247 $adverb =~ s/^sigspace/s/; 1248 $adverb =~ s/^ratchet/r/; 1214 1249 1215 1250 if (m/^\(/) { … … 1224 1259 } 1225 1260 } 1261 elsif (s/^<(.*?)>//) { 1262 $adverbs{$adverb} = $1; 1263 } 1226 1264 else { 1227 1265 $adverbs{$adverb} = 0+!$not; … … 1784 1822 elsif ($text eq '::') { 1785 1823 $PURE = 0; 1786 $code = "\$C->_COMMITBRANCH$REV()"; 1824 my $extra = $self->{extra} || ''; 1825 $code = "\$C->_COMMITBRANCH$REV($extra)"; 1787 1826 $MAYBACKTRACK = 1; 1788 1827 } … … 1876 1915 my $rest = ::un6($$self{rest}) // ''; 1877 1916 my $name = $$self{name}; 1917 warn ::Dump(%adverbs) if $REV; 1878 1918 ::panic("Can't reverse $name") if $REV; 1879 1919 $PURE = 0 if $impure{$name};
