Changeset 22532 for src/perl6

Show
Ignore:
Timestamp:
10/08/08 08:49:33 (6 weeks ago)
Author:
lwall
Message:

[STD] switch to '(' ~ ')' <foo> format for readability and better errors
[gimme5] support for ~ construct and :dba<>

Location:
src/perl6
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/perl6/STD.pm

    r22508 r22532  
    453453    :my $startpos = self.pos; 
    454454 
     455    :dba<simple whitespace> 
    455456    [ 
    456457        | \h+ <![#\s\\]> { $¢.<_>[$¢.pos]<ws> = $startpos; }    # common case 
     
    460461    ] 
    461462    || 
     463    :dba<complicated whitespace> 
    462464    [ 
    463465    | <.unsp> 
     
    585587 
    586588token block { 
    587     '{' <in: '}', 'statementlist', 'block'> 
     589    '{' ~ '}' <statementlist> 
    588590 
    589591    [ 
     
    593595    | <.unv>? $$ <.ws> 
    594596        { $¢.<_>[$¢.pos]<endstmt> = 2; } {*}                    #= endstmt complex 
    595     | {*} { $¢.<_>[$¢.pos]<endargs> = 1; }                      #= endargs 
     597    | { $¢.<_>[$¢.pos]<endargs> = 1; } <.ws> {*}                #= endargs 
    596598    ] 
    597599} 
     
    619621    | <.unv>? $$ <.ws> 
    620622        { $¢.<_>[$¢.pos]<endstmt> = 2; } {*}                    #= endstmt complex 
    621     | {*} { $¢.<_>[$¢.pos]<endargs> = 1; }                      #= endargs 
     623    | { $¢.<_>[$¢.pos]<endargs> = 1; } <.ws>  {*}               #= endargs 
    622624    ] 
    623625} 
     
    667669    | <statement_control>                        {*}            #= control 
    668670    | <EXPR> {*}                                                #= expr 
     671        :dba<statement end> 
    669672        [ 
    670673        || <?{ ($¢.<_>[$¢.pos]<endstmt> // 0) == 2 }>   # no mod after end-line curly 
    671674        || 
     675            :dba<statement modifier> 
    672676            [ 
    673677            | <statement_mod_loop> {*}                              #= mod loop 
    674678            | <statement_mod_cond> {*}                              #= mod cond 
     679                :dba<statement modifier loop> 
    675680                [ 
    676681                || <?{ ($¢.<_>[$¢.pos]<endstmt> // 0) == 2 }> 
     
    696701} 
    697702 
    698 rule statement_control:use {\ 
    699     <sym> 
     703token statement_control:use { 
     704    <sym> :s 
    700705    [ 
    701706    | <version> 
     
    709714 
    710715 
    711 rule statement_control:no {\ 
    712     <sym> 
     716token statement_control:no { 
     717    <sym> :s 
    713718    <module_name><arglist>? 
    714719} 
    715720 
    716721 
    717 rule statement_control:if {\ 
    718     <sym> 
     722token statement_control:if { 
     723    <sym> :s 
    719724    <xblock> 
    720725    $<elsif> = ( 
     
    727732 
    728733 
    729 rule statement_control:unless {\ 
    730     <sym>  
     734token statement_control:unless { 
     735    <sym> :s 
    731736    <xblock> 
    732737    [ <!before 'else'> || <.panic: "unless does not take \"else\" in Perl 6; please rewrite using \"if\""> ] 
     
    734739 
    735740 
    736 rule statement_control:while {\ 
    737     <sym> 
     741token statement_control:while { 
     742    <sym> :s 
    738743    [ <?before '(' ['my'? '$'\w+ '=']? '<' '$'?\w+ '>' ')'>   #' 
    739744        <.panic: "This appears to be Perl 5 code"> ]? 
     
    742747 
    743748 
    744 rule statement_control:until {\ 
    745     <sym> 
     749token statement_control:until { 
     750    <sym> :s 
    746751    <xblock> 
    747752} 
    748753 
    749754 
    750 rule statement_control:repeat {\ 
    751     <sym> 
     755token statement_control:repeat { 
     756    <sym> :s 
    752757    [ 
    753758        | ('while'|'until') 
     
    759764 
    760765 
    761 rule statement_control:loop {\ 
    762     <sym> 
     766token statement_control:loop { 
     767    <sym> :s 
    763768    $<eee> = ( 
    764769        '(' 
     
    772777 
    773778 
    774 rule statement_control:for {\ 
    775     <sym> 
     779token statement_control:for { 
     780    <sym> :s 
    776781    [ <?before 'my'? '$'\w+ '(' > 
    777782        <.panic: "This appears to be Perl 5 code"> ]? 
     
    779784} 
    780785 
    781 rule statement_control:given {\ 
    782     <sym> 
     786token statement_control:given { 
     787    <sym> :s 
    783788    <xblock> 
    784789} 
    785 rule statement_control:when {\ 
    786     <sym> 
     790token statement_control:when { 
     791    <sym> :s 
    787792    <xblock> 
    788793} 
     
    936941        ] 
    937942        {*}                                                     #= value 
    938     | '(' <in: ')', 'signature'> 
     943    | :dba<signature> '(' ~ ')' <signature> 
    939944    | <postcircumfix> 
    940945        { $key = ""; $value = $<postcircumfix>; } 
     
    11091114 
    11101115token postcircumfix:sym<( )> ( --> Methodcall) 
    1111     { '(' <in: ')', 'semilist', 'argument list'> } 
     1116    { :dba<argument list> '(' ~ ')' <semilist> } 
    11121117 
    11131118token postcircumfix:sym<[ ]> ( --> Methodcall) 
    1114     { '[' <in: ']', 'semilist', 'subscript'> } 
     1119    { :dba<subscript> '[' ~ ']' <semilist> } 
    11151120 
    11161121token postcircumfix:sym<{ }> ( --> Methodcall) 
    1117     { '{' <in: '}', 'semilist', 'subscript'> } 
     1122    { :dba<subscript> '{' ~ '}' <semilist> } 
    11181123 
    11191124token postcircumfix:sym«< >» ( --> Methodcall) 
     
    11401145 
    11411146    [ 
    1142     | '.'? <.unsp>? '(' <in: ')', 'semilist', 'argument list'> 
     1147    | '.'? <.unsp>? '(' ~ ')' <semilist> 
    11431148    | ':' <?before \s> <!{ $+inquote }> <arglist> 
    11441149    ]? 
     
    11661171        <.unsp>? 
    11671172        [ 
    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> 
    11711176        | <?before '<'> <postcircumfix> 
    11721177        ]* 
     
    12891294    [ 
    12901295    | <variable_declarator> 
    1291     | '(' <in: ')', 'signature'> <trait>* 
     1296    | '(' ~ ')' <signature> <trait>* 
    12921297    | <routine_declarator> 
    12931298    | <regex_declarator> 
     
    16481653        [ 
    16491654        | <identifier> 
    1650         | '(' <in: ')', 'EXPR', 'indirect name'> 
     1655        | :dba<indirect name> '(' ~ ')' <EXPR> 
    16511656        ] 
    16521657    ]? 
     
    16671672#token subcall { 
    16681673#    # XXX should this be sublongname? 
    1669 #    <subshortname> <.unsp>? '.'? '(' <in: ')', 'semilist'> 
     1674#    <subshortname> <.unsp>? '.'? '(' ~ ')' <semilist> 
    16701675#    {*} 
    16711676#} 
     
    24602465rule multisig { 
    24612466    [ 
    2462         ':'?'(' <in: ')', 'signature'> 
     2467        ':'?'(' ~ ')' <signature> 
    24632468    ] 
    24642469    ** '|' 
     
    24802485    | <sigil> '.' 
    24812486        [ 
    2482         | '(' <in: ')', 'signature'> 
    2483         | '[' <in: ']', 'signature'> 
    2484         | '{' <in: '}', 'signature'> 
     2487        | '(' ~ ')' <signature> 
     2488        | '[' ~ ']' <signature> 
     2489        | '{' ~ '}' <signature> 
    24852490        | <?before '<'> <postcircumfix> 
    24862491        ] 
     
    25452550 
    25462551token sigterm { 
    2547     ':(' <in: ')', 'signature'> 
     2552    ':(' ~ ')' <signature> 
    25482553} 
    25492554 
     
    25642569} 
    25652570 
    2566 rule type_declarator:subset {\ 
    2567     <sym> 
     2571token type_declarator:subset { 
     2572    <sym> :s 
    25682573    <longname> { $¢.add_type($<longname>); } 
    25692574    [ of <fulltypename> ]? 
     
    27722777 
    27732778token circumfix:sigil ( --> Term) 
    2774     { <sigil> '(' <in: ')', 'semilist', 'contextualizer'> } 
     2779    { :dba<contextualizer> <sigil> '(' ~ ')' <semilist> } 
    27752780 
    27762781#token circumfix:typecast ( --> Term) 
    2777 #    { <typename> '(' <in: ')', 'semilist'> } 
     2782#    { <typename> '(' ~ ')' <semilist> } 
    27782783 
    27792784token circumfix:sym<( )> ( --> Term) 
    2780     { '(' <in: ')', 'semilist', 'parenthesized expression'> } 
     2785    { :dba<parenthesized expression> '(' ~ ')' <semilist> } 
    27812786 
    27822787token circumfix:sym<[ ]> ( --> Term) 
    2783     { '[' <in: ']', 'semilist', 'array composer'> } 
     2788    { :dba<array composer> '[' ~ ']' <semilist> } 
    27842789 
    27852790## methodcall 
     
    31683173    { <sym> } 
    31693174 
     3175token infix:sym<...> ( --> List_infix) 
     3176    { <sym> } 
     3177 
    31703178token term:sym<...> ( --> List_prefix) 
    31713179    { <sym> <args>? } 
     
    32023210    :my $listopish = 0; 
    32033211    [ 
    3204     | '.(' <in: ')', 'semilist', 'argument list'> {*}             #= func args 
    3205     | '(' <in: ')', 'semilist', 'argument list'> {*}              #= func args 
    3206     | <.unsp> '.'? '(' <in: ')', 'semilist', 'argument list'> {*} #= func args 
     3212    | :dba<argument list> '.(' ~ ')' <semilist> {*}             #= func args 
     3213    | :dba<argument list> '(' ~ ')' <semilist> {*}              #= func args 
     3214    | :dba<argument list> <.unsp> '.'? '(' ~ ')' <semilist> {*} #= func args 
    32073215    | {} [<?before \s> <!{ $istype }> <.ws> <!infixstopper> <arglist> { $listopish = 1 }]? 
    32083216    ] 
     
    37423750        <!before '$$'> 
    37433751        <?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> )? 
    37473754        { $<sym> = $<variable>.item; } 
     3755    } 
     3756 
     3757    token metachar:sym<~> { 
     3758        <sym> 
    37483759    } 
    37493760 
     
    38463857    } 
    38473858 
    3848     token mod_arg { '(' <in: ')', 'semilist', 'modifier argument'> } 
     3859    token mod_arg { :dba<modifier argument> '(' ~ ')' <semilist> } 
    38493860 
    38503861    token mod_internal:sym<:my>    { ':' <?before 'my' \s > [:lang($¢.cursor_fresh($+LANG)) <statement> <eat_terminator> ] } 
     
    41634174} 
    41644175 
    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'"> 
     4176method SETGOAL { } 
     4177method FAILGOAL (Str $stop, Str $name) { 
     4178    self.panic("Unable to parse $name; couldn't find final '$stop'"); 
    41694179} 
    41704180 
  • src/perl6/gimme5

    r22498 r22532  
    3939our $PURE; 
    4040our $MAYBACKTRACK; 
     41our @STUFFED; 
    4142our @DECL; 
    4243our $SYM; 
     
    460461 
    461462            local $MAYBACKTRACK = 1; 
     463            $adverbs{r} = 0; 
     464            $adverbs{s} = 0; 
     465            $adverbs{dba} = $NAME; 
    462466            if ($KIND eq 'token' or $KIND eq 'rule') { 
    463467                $MAYBACKTRACK = 0; 
     468                $adverbs{r} = 1; 
     469                if ($KIND eq 'rule') { 
     470                    $adverbs{s} = 1; 
     471                } 
    464472            } 
    465473 
     
    924932 
    925933sub ws { 
    926     return if $KIND eq 'rule';  # meta whitespace parsed in atom 
     934    return if $adverbs{s};  # meta whitespace parsed in atom 
    927935    for (;;) { 
    928936#       next if s/^(?!=[\0-~])\s+//; 
     
    954962    ws(); 
    955963    local $STOP = shift; 
     964    local %adverbs = %adverbs; 
    956965 
    957966    my @decl; 
     
    11031112        my $min = 0; 
    11041113        if (not $m) { 
    1105             if ($KIND eq 'rule' or $KIND eq 'token') { 
     1114            if ($adverbs{r}) { 
    11061115                $m = ':'; 
    11071116            } 
     
    11411150sub atom { 
    11421151    here(); 
     1152    if (@STUFFED) { 
     1153        return shift @STUFFED; 
     1154    } 
     1155    # unspace 
    11431156    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}) { 
    11471161        wsany(); 
    11481162        return bless { name => 'ws', nobind => 1, noquant => 1, min => 0, rest => '' }, 
     
    11591173    if (/^[*+?]/) { panic "quantifier quantifies nothing"; } 
    11601174 
     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    } 
    11611195    if (s/^ (\w+) (?! \s* [*+?]) //x) { 
    11621196        my $word = $1; 
     
    12111245        my $not = $1 ne ''; 
    12121246        my $adverb = $2; 
    1213         local %adverbs = %adverbs; 
     1247        $adverb =~ s/^sigspace/s/; 
     1248        $adverb =~ s/^ratchet/r/; 
    12141249         
    12151250        if (m/^\(/) { 
     
    12241259            } 
    12251260        } 
     1261        elsif (s/^<(.*?)>//) { 
     1262            $adverbs{$adverb} = $1; 
     1263        } 
    12261264        else { 
    12271265            $adverbs{$adverb} = 0+!$not; 
     
    17841822        elsif ($text eq '::') { 
    17851823            $PURE = 0; 
    1786             $code = "\$C->_COMMITBRANCH$REV()"; 
     1824            my $extra = $self->{extra} || ''; 
     1825            $code = "\$C->_COMMITBRANCH$REV($extra)"; 
    17871826            $MAYBACKTRACK = 1; 
    17881827        } 
     
    18761915        my $rest = ::un6($$self{rest}) // ''; 
    18771916        my $name = $$self{name}; 
     1917        warn ::Dump(%adverbs) if $REV; 
    18781918        ::panic("Can't reverse $name") if $REV; 
    18791919        $PURE = 0 if $impure{$name};