Legend:
- Unmodified
- Added
- Removed
-
src/perl6/Cursor.pmc
r21813 r21819 12 12 our $DEBUG = $ENV{STD5DEBUG} // 0; 13 13 $::DEBUG = $DEBUG; 14 15 # various bits of info useful for error messages 14 16 $::HIGHWATER = 0; 15 17 $::HIGHMESS = ''; … … 918 920 sub add_macro { my $lang = shift; 919 921 my $start = shift; 922 state $GEN = "500"; 920 923 $lang->{_from} = $start->{_from}; 921 924 my $name = $lang->text; 925 my $WHAT = ref $lang; 922 926 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"; 973 package $genpkg; 974 use Moose ':all' => { -prefix => 'moose_' }; 975 moose_extends('$WHAT'); 976 977 # $rule 978 979 my \$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 994 sub $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 } 1010 1; 929 1011 END 1012 eval $e or die "Can't create $name: $@\n"; 1013 $::PARSER = $lang->cursor_fresh($genpkg); 930 1014 } 931 1015 $lang; -
src/perl6/STD.pm
r21817 r21819 6 6 my @PKGS; 7 7 my $GOAL is context = "(eof)"; 8 my $PARSER is context<rw>; 8 9 9 10 # random rule for debugging, please ignore … … 532 533 # statement semantics 533 534 rule statementlist { 535 :my $PARSER is context<rw> = self; 534 536 [ 535 537 | <?before <[\)\]\}]> > … … 563 565 :my $endargs is context = -1; 564 566 <!before <[\)\]\}]> > 567 <!!{ bless $¢, ref $PARSER; }> 565 568 [ 566 569 | <label> <statement> {*} #= label … … 807 810 | <circumfix> 808 811 | <dotty> 809 # | <subcall>810 812 | <value> 811 813 | <capterm> … … 933 935 } 934 936 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.)937 937 regex prefix_circumfix_meta_operator:reduce (--> List_prefix) { 938 938 $<s> = ( … … 1515 1515 token deflongname { 1516 1516 <name> 1517 [ <colonpair>+ { $¢ = $¢.add_macro($<name>); } ]? 1517 # XXX too soon 1518 [ <colonpair>+ { $¢.add_macro($<name>); } ]? 1518 1519 } 1519 1520 … … 1541 1542 token subshortname { 1542 1543 [ 1543 | <category> <colonpair>+ 1544 | <category> 1545 [ <colonpair>+ { $¢.add_macro($<category>); } ]? 1544 1546 | <desigilname> 1545 1547 ] … … 2346 2348 2347 2349 rule routine_def { 2348 <deflongname>? <multisig>?2349 < trait>*2350 [ '&'<deflongname>? | <deflongname> ]? [ <multisig> | <trait> ]* 2351 <!!{ bless $¢, ref $PARSER; }> 2350 2352 <block> 2351 2353 } … … 2353 2355 rule method_def { 2354 2356 [ 2355 | '!'?<longname> <multisig>?2357 | '!'?<longname> [ <multisig> | <trait> ]* 2356 2358 | <sigil> '.' 2357 2359 [ … … 2361 2363 | <?before '<'> <postcircumfix> 2362 2364 ] 2363 ]2364 <trait>*2365 <trait>* 2366 ] 2365 2367 <block> 2366 2368 } … … 2368 2370 rule regex_def { 2369 2371 <longname>? 2370 [ ':'?'(' <signature> ')']? 2371 <trait>* 2372 [ [ ':'?'(' <signature> ')'] | <trait> ]* 2372 2373 <regex_block> 2373 2374 } 2374 2375 2375 # XXX redundant with routine_def?2376 2376 rule macro_def { 2377 <deflongname>? <multisig>? 2378 <trait>* 2377 [ '&'<deflongname>? | <deflongname> ]? [ <multisig> | <trait> ]* 2379 2378 <block> 2380 2379 } … … 2384 2383 | <trait_verb> 2385 2384 | <trait_auxiliary> 2385 | <colonpair> 2386 2386 ] 2387 2387 } -
src/perl6/gimme5
r21799 r21819 71 71 sub un6 { 72 72 my $f = shift; 73 #my $trace = $f =~ /PARSER/; 73 74 my $t; 74 75 $f =~ s/\\x([0-9a-fA-F]{3,4})/\\x{$1}/g; 75 76 $f =~ s!\$([0-9]+)!\$\$C{$1}!g; 76 77 while ($f ne "") { 78 #print "$f\n" if $trace; 77 79 $f =~ s/^\)</.</ and $t .= ')', next; 78 80 $f =~ s/^\.\(/(/ and $t .= '->', next; … … 184 186 $f =~ s/^\bwhile\s+(.*?) \{/($1) {/ and $t .= qq/while /, next; 185 187 $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;/s188 $f =~ s/^\bmy\s+(?:[A-Z]\w+)?\s*([\$\@%]\w+)\s+is\s+context(?:<rw>)?\s*(?:is\s*rw)?\s*=(\s*.*);/$2;/s 187 189 and $t .= qq/local $1 = /, $OUR{$1}++, next; 188 190 $f =~ s/^\bdo given\s+(.*?\S)\s+\{/$1; if (0) {}/ -
src/perl6/mangle.pl
r20780 r21819 37 37 s/\?/Question/g; 38 38 s/\//Slash/g; 39 s/( \W)/sprintf("_%02x_",ord($1))/eg;39 s/([^a-zA-Z_0-9])/sprintf("_%02x_",ord($1))/eg; 40 40 } 41 41 join '_', @list;
