Changeset 21819 for src/perl6

Show
Ignore:
Timestamp:
08/07/08 11:01:41 (4 months ago)
Author:
lwall
Message:

[STD vs t] user-defined prefix, infix, and postfix ops now derive new languages
(no support for equiv or assoc traits yet, nor for circumfix etc.)
start of support for $?PARSER, now parses 99.74% of t/
traits and sigs may now be intermixed
an anonumous subname may be represented with '&' in sub & is foo {...}
now parses 99.74% of t

Location:
src/perl6
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • src/perl6/Cursor.pmc

    r21813 r21819  
    1212our $DEBUG = $ENV{STD5DEBUG} // 0; 
    1313$::DEBUG = $DEBUG; 
     14 
     15# various bits of info useful for error messages 
    1416$::HIGHWATER = 0; 
    1517$::HIGHMESS = ''; 
     
    918920sub add_macro { my $lang = shift; 
    919921    my $start = shift; 
     922    state $GEN = "500"; 
    920923    $lang->{_from} = $start->{_from}; 
    921924    my $name = $lang->text; 
     925    my $WHAT = ref $lang; 
    922926    if ($name =~ s/:/:sym/) { 
    923         print "macro $name\n"; 
    924         eval <<'END'; 
    925 #package $genpkg; 
    926 #use Moose ':all' => { -prefix => 'moose_' }; 
    927 #moose_extends('$WHAT'); 
    928 #moose_with(" . join(',', map {"'$_'"} @newmix) . "); 
     927        my ($sym) = $name =~ /:sym(.*)/; 
     928        if ($sym =~ s/^«(.*)»$/$1/) { 
     929            my $ok = "'"; 
     930            for my $try (qw( ' / ! : ; | + - = )) { 
     931                $ok = $try, last if index($sym,$try) < 0; 
     932            } 
     933            $sym = $ok . $sym . $ok; 
     934        } 
     935 
     936        my $rule = "token $name { <sym> }"; 
     937 
     938        my $mangle = $name; 
     939        $mangle =~ s/^(\w*):(sym)?//; 
     940        my $category = $1; 
     941        my @list; 
     942        if ($mangle =~ s/^<(.*)>$/$1/ or 
     943            $mangle =~ s/^«(.*)»$/$1/) { 
     944            $mangle =~ s/\\(.)/$1/g; 
     945            @list = $mangle =~ /(\S+)/g; 
     946        } 
     947        elsif ($mangle =~ s/^\[(.*)\]$/$1/ or 
     948            $mangle =~ s/^\{(.*)\}$/$1/) { 
     949            @list = eval $mangle; 
     950        } 
     951        else { 
     952            @list = $mangle; 
     953        } 
     954        $mangle = ::mangle(@list); 
     955        $mangle = $category . '__S_' . sprintf("%03d",$GEN++) . $mangle; 
     956 
     957        # XXX assuming no equiv 
     958        my $coercion = 'Additive'; 
     959        if ($name =~ /^prefix:/) { 
     960            if ($sym =~ /^\W/) { 
     961                $coercion = 'Symbolic_unary'; 
     962            } 
     963            else { 
     964                $coercion = 'Named_unary'; 
     965            } 
     966        } 
     967        elsif ($name =~ /^postfix:/) { 
     968            $coercion = 'Methodcall'; 
     969        } 
     970 
     971        my $genpkg = $WHAT . '::_' . $mangle; 
     972        my $e = <<"END"; 
     973package $genpkg; 
     974use Moose ':all' => { -prefix => 'moose_' }; 
     975moose_extends('$WHAT'); 
     976 
     977# $rule 
     978 
     979my \$retree = { 
     980    '$mangle' => bless({ 
     981        'kind' => 'token', 
     982        'min' => 12345, 
     983        're' => bless({ 
     984            'a' => 0, 
     985            'i' => 0, 
     986            'min' => 12345, 
     987            'name' => 'sym', 
     988            'rest' => '', 
     989            'sym' => q$sym, 
     990        }, 'RE_method'), 
     991    }, 'RE'), 
     992}; 
     993 
     994sub $mangle { 
     995    my \$self = shift; 
     996    local \$CTX = \$self->callm() if \$::DEBUG & DEBUG::trace_call; 
     997    if (\$self->{_peek}) { 
     998        return \$self->_AUTOLEXpeek('$mangle',\$retree) 
     999    } 
     1000    my %args = \@_; 
     1001    my \$sym = \$args{sym} // q$sym; 
     1002 
     1003    my \$C = \$self; 
     1004    \$C->{'sym'} = \$sym; 
     1005 
     1006    \$self->_MATCHIFY( Cursor::lazymap sub { STD::$coercion->coerce(\$_[0]) }, 
     1007        \$C->_SYM(\$sym, 0) 
     1008    ); 
     1009} 
     10101; 
    9291011END 
     1012        eval $e or die "Can't create $name: $@\n"; 
     1013        $::PARSER = $lang->cursor_fresh($genpkg); 
    9301014    } 
    9311015    $lang; 
  • src/perl6/STD.pm

    r21817 r21819  
    66my @PKGS; 
    77my $GOAL is context = "(eof)"; 
     8my $PARSER is context<rw>; 
    89 
    910# random rule for debugging, please ignore 
     
    532533# statement semantics 
    533534rule statementlist { 
     535    :my $PARSER is context<rw> = self; 
    534536    [ 
    535537    | <?before <[\)\]\}]> > 
     
    563565    :my $endargs is context = -1; 
    564566    <!before <[\)\]\}]> > 
     567    <!!{ bless $¢, ref $PARSER; }> 
    565568    [ 
    566569    | <label> <statement>                        {*}            #= label 
     
    807810    | <circumfix> 
    808811    | <dotty> 
    809 #    | <subcall> 
    810812    | <value> 
    811813    | <capterm> 
     
    933935} 
    934936 
    935 # Note: backtracks, or we'd never get to parse [LIST] on seeing [+ and such. 
    936 # (Also backtracks if on \op when no \op infix exists.) 
    937937regex prefix_circumfix_meta_operator:reduce (--> List_prefix) { 
    938938    $<s> = ( 
     
    15151515token deflongname { 
    15161516    <name> 
    1517     [ <colonpair>+ { $¢ = $¢.add_macro($<name>); } ]? 
     1517    # XXX too soon 
     1518    [ <colonpair>+ { $¢.add_macro($<name>); } ]? 
    15181519} 
    15191520 
     
    15411542token subshortname { 
    15421543    [ 
    1543     | <category> <colonpair>+ 
     1544    | <category> 
     1545        [ <colonpair>+ { $¢.add_macro($<category>); } ]? 
    15441546    | <desigilname> 
    15451547    ] 
     
    23462348 
    23472349rule routine_def { 
    2348     <deflongname>?  <multisig>? 
    2349     <trait>* 
     2350    [ '&'<deflongname>? | <deflongname> ]? [ <multisig> | <trait> ]* 
     2351    <!!{ bless $¢, ref $PARSER; }> 
    23502352    <block> 
    23512353} 
     
    23532355rule method_def { 
    23542356    [ 
    2355     | '!'?<longname>  <multisig>? 
     2357    | '!'?<longname> [ <multisig> | <trait> ]* 
    23562358    | <sigil> '.' 
    23572359        [ 
     
    23612363        | <?before '<'> <postcircumfix> 
    23622364        ] 
    2363     ] 
    2364     <trait>* 
     2365        <trait>* 
     2366    ] 
    23652367    <block> 
    23662368} 
     
    23682370rule regex_def { 
    23692371    <longname>? 
    2370     [ ':'?'(' <signature> ')']? 
    2371     <trait>* 
     2372    [ [ ':'?'(' <signature> ')'] | <trait> ]* 
    23722373    <regex_block> 
    23732374} 
    23742375 
    2375 # XXX redundant with routine_def? 
    23762376rule macro_def { 
    2377     <deflongname>?  <multisig>? 
    2378     <trait>* 
     2377    [ '&'<deflongname>? | <deflongname> ]? [ <multisig> | <trait> ]* 
    23792378    <block> 
    23802379} 
     
    23842383    | <trait_verb> 
    23852384    | <trait_auxiliary> 
     2385    | <colonpair> 
    23862386    ] 
    23872387} 
  • src/perl6/gimme5

    r21799 r21819  
    7171sub un6 { 
    7272    my $f = shift; 
     73    #my $trace = $f =~ /PARSER/; 
    7374    my $t; 
    7475    $f =~ s/\\x([0-9a-fA-F]{3,4})/\\x{$1}/g; 
    7576    $f =~ s!\$([0-9]+)!\$\$C{$1}!g; 
    7677    while ($f ne "") { 
     78        #print "$f\n" if $trace; 
    7779        $f =~ s/^\)</.</                        and $t .= ')', next; 
    7880        $f =~ s/^\.\(/(/                        and $t .= '->', next; 
     
    184186        $f =~ s/^\bwhile\s+(.*?) \{/($1) {/     and $t .= qq/while /, next; 
    185187        $f =~ s/^\bfor\s+(.*?) \{/($1) {/       and $t .= qq/for /, next; 
    186         $f =~ s/^\bmy\s+(?:[A-Z]\w+)?\s*([\$\@%]\w+)\s+is\s+context(?:<rw>)?\s*(?:is\s*rw)?\s*=\s*(.*);/$2;/s 
     188        $f =~ s/^\bmy\s+(?:[A-Z]\w+)?\s*([\$\@%]\w+)\s+is\s+context(?:<rw>)?\s*(?:is\s*rw)?\s*=(\s*.*);/$2;/s 
    187189                                                and $t .= qq/local $1 = /, $OUR{$1}++, next; 
    188190        $f =~ s/^\bdo given\s+(.*?\S)\s+\{/$1; if (0) {}/ 
  • src/perl6/mangle.pl

    r20780 r21819  
    3737        s/\?/Question/g; 
    3838        s/\//Slash/g; 
    39         s/(\W)/sprintf("_%02x_",ord($1))/eg; 
     39        s/([^a-zA-Z_0-9])/sprintf("_%02x_",ord($1))/eg; 
    4040    } 
    4141    join '_', @list;