Changeset 14598

Show
Ignore:
Timestamp:
11/03/06 02:14:10 (2 years ago)
Author:
audreyt
svk:copy_cache_prev:
41990
Message:

* Quite impossibly, most of MiniPerl?6 is now parsed!

<fglock> Now let's write an emitter!
<audreyt> Or two...

Location:
v6/v6-MiniPerl6
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • v6/v6-MiniPerl6/lib/MiniPerl6/Grammar.pm

    r14597 r14598  
    1919sub Val::Int($data)    { use v5; bless $data, 'Val::Int';    use v6; } 
    2020sub Val::Num($data)    { use v5; bless $data, 'Val::Num';    use v6; } 
     21sub Val::Buf($data)    { use v5; bless $data, 'Val::Buf';    use v6; } 
    2122 
    2223# XXX - move to v6.pm emitter 
     
    2526token comp_unit { 
    2627    <?ws>? 
    27     class <?ws>? <ident> \{ 
     28    class <?ws>? <ident> <?ws>? \{ 
     29        <?ws>? 
     30        <exp_stmts> 
    2831        <?ws>? 
    2932    \} 
     
    3134    { 
    3235        return CompUnit({ 
    33             name => $<ident>, 
    34             attributes => {}, 
    35             methods => {}, 
    36             body => {}, 
     36            name        => $$<ident>, 
     37            attributes  => {}, 
     38            methods     => {}, 
     39            body        => $$<exp_stmts>, 
    3740        }) 
    3841    } 
     
    4043 
    4144token exp { 
    42     [ $<exp> := <var>       # $variable 
    43     | $<exp> := <val>       # "value" 
    44     | $<exp> := <lit>       # [literal construct] 
    45     | $<exp> := <bind>      # $lhs := $rhs 
    46     | $<exp> := <index>     # $obj[1, 2, 3] 
    47     | $<exp> := <lookup>    # $obj{'1', '2', '3'} 
    48     | $<exp> := <control>   # Various control structures.  Does _not_ appear in binding LHS 
    49     ] 
    50     { return $$<exp> } 
    51 } 
     45    <term> [ 
     46        | <?ws>? <':='> <?ws>? <exp> 
     47        { return Bind({ parameters => $$<term>, arguments => $$<exp> }) } 
     48        | \. <ident> 
     49            [ \( <?ws>? <exp_seq> <?ws>? \) 
     50            | \: <?ws> <exp_seq> <?ws>? 
     51            ] 
     52            { 
     53                return Call({ 
     54                    invocant  => $$<term>, 
     55                    method    => $$<ident>, 
     56                    arguments => $$<exp_seq>, 
     57                }) 
     58            } 
     59        | { return $$<term> } 
     60    ] 
     61} 
     62 
     63token term { 
     64    [ $<term> := <var>       # $variable 
     65    | $<term> := <val>       # "value" 
     66    | $<term> := <lit>       # [literal construct] 
     67#   | $<term> := <bind>      # $lhs := $rhs 
     68    | $<term> := <index>     # $obj[1, 2, 3] 
     69    | $<term> := <lookup>    # $obj{'1', '2', '3'} 
     70    | $<term> := <control>   # Various control structures.  Does _not_ appear in binding LHS 
     71    ] 
     72    { return $$<term> } 
     73} 
     74 
     75token index { XXX } 
     76token lookup { XXX } 
    5277 
    5378token control { 
    54     [ $<exp> := <call>      # $obj.method($arg1, $arg2) 
    55     | $<exp> := <apply>     # $obj($arg1, $arg2) 
    56     | $<exp> := <return>    # return 123; 
     79    [ $<exp> := <return>    # return 123; 
    5780    | $<exp> := <leave>     # last; break; 
    5881    | $<exp> := <if>        # 1 ?? 2 !! 3 
     
    6083    | $<exp> := <for>       # $x.map(-> $i {...}) 
    6184    | $<exp> := <while>     # while ... { ... } 
     85    | $<exp> := <apply>     # $obj($arg1, $arg2) 
     86 #  | $<exp> := <call>      # $obj.method($arg1, $arg2) 
    6287    ] 
    6388    { return $$<exp> } 
     
    6691token if { 
    6792    if <?ws>  $<cond>      := <exp>     <?ws>? 
    68     \{ <?ws>? $<body>      := <exp_seq> <?ws>? \} <?ws>? 
     93    \{ <?ws>? $<body>      := <exp_stmts> <?ws>? \} <?ws>? 
    6994    else <?ws>?  
    70     \{ <?ws>? $<otherwise> := <exp_seq> <?ws>? \} 
     95    \{ <?ws>? $<otherwise> := <exp_stmts> <?ws>? \} 
    7196    { return If({ :$$<cond>, :$$<body>, :$$<otherwise> }) } 
    7297} 
    7398 
    7499token when { 
    75     when <?ws> $<parameters> := <exp_seq> <?ws>? \{ <?ws>? $<body> := <exp_seq> <?ws>? \} 
     100    when <?ws> $<parameters> := <exp_seq> <?ws>? \{ <?ws>? $<body> := <exp_stmts> <?ws>? \} 
    76101    { return When({ :$$<parameters>, :$$<body> }) } 
    77102} 
    78103 
    79104token for { 
    80     for <?ws> <exp> <?ws>? <'->'> <?ws>? <var> <?ws> \{ <?ws>? <exp_seq> <?ws>? \} 
    81     { return For({ cond => $$<exp>, topic => $$<var>, body => $$<exp_seq> }) } 
     105    for <?ws> <exp> <?ws>? <'->'> <?ws>? <var> <?ws> \{ <?ws>? <exp_stmts> <?ws>? \} 
     106    { return For({ cond => $$<exp>, topic => $$<var>, body => $$<exp_stmts> }) } 
    82107} 
    83108 
    84109token while { 
    85     while <?ws> <exp> <?ws> \{ <?ws>? <exp_seq> <?ws>? \} 
    86     { return While({ cond => $$<exp>, body => $$<exp_seq> }) } 
     110    while <?ws> <exp> <?ws> \{ <?ws>? <exp_stmts> <?ws>? \} 
     111    { return While({ cond => $$<exp>, body => $$<exp_stmts> }) } 
     112} 
     113 
     114token leave { 
     115    leave 
     116    { return Leave({}) } 
    87117} 
    88118 
     
    119149} 
    120150 
     151token val_bit { 
     152    | True \b { return Val::Bit( { bit => 0 } ) } 
     153    | False \b { return Val::Bit( { bit => 1 } ) } 
     154} 
     155 
    121156token val_undef { 
    122157    undef 
     
    124159} 
    125160 
     161token val_num {  XXX { return "TODO: val_num" } } 
     162token val_buf { 
     163    | \" (<-[\"]>+) \" { return Val::Buf( { buf => $$0 } ) } 
     164    | \' (<-[\']>+) \' { return Val::Buf( { buf => $$0 } ) } 
     165} 
     166 
    126167token val_int { 
    127168    \d+ 
     
    129170} 
    130171 
     172token exp_stmts { 
     173    | <exp> 
     174        [ 
     175        |   <?ws>? \; <?ws>? <exp_stmts> 
     176            <?ws>? [\; <?ws>?]? 
     177            { return [ $$<exp>, array( $$<exp_stmts> ) ] } 
     178        |   { return [ $$<exp> ] } 
     179        ] 
     180    | { return [] } 
     181} 
     182 
    131183token exp_seq { 
    132     <exp> 
    133     [ 
    134     |   <?ws>? \, <?ws>? <exp_seq>  
    135         { return [ $$<exp>, array( $$<exp_seq> ) ] } 
    136     |   { return [ $$<exp> ] } 
    137     ] 
     184    | <exp> 
     185        [ 
     186        |   <?ws>? \, <?ws>? <exp_seq>  
     187            <?ws>? [\, <?ws>?]? 
     188            { return [ $$<exp>, array( $$<exp_seq> ) ] } 
     189        |   { return [ $$<exp> ] } 
     190        ] 
     191    | { return [] } 
    138192} 
    139193 
     
    159213} 
    160214 
     215token lit_seq {  XXX { return "TODO: lit_seq" } } 
     216token lit_array {  XXX { return "TODO: lit_array" } } 
     217token lit_hash {  XXX { return "TODO: lit_hash" } } 
     218 
    161219token lit_code { 
    162     { die "TODO - Lit::Code" } 
     220    XXX { return "TODO - Lit::Code" } 
    163221} 
    164222 
     
    197255    } 
    198256} 
     257 
    199258token apply { 
    200     <ident> \( <?ws>? <exp_seq> <?ws>? \) 
     259    <ident> 
     260        [ \( <?ws>? <exp_seq> <?ws>? \) 
     261        | <?ws> <exp_seq> <?ws>? 
     262        ] 
    201263    { 
    202264        return Apply({ 
  • v6/v6-MiniPerl6/t/01-sanity.t

    r14597 r14598  
    22use MiniPerl6::Grammar; 
    33use Data::Dumper; 
     4 
     5{ 
     6  my $p = MiniPerl6::Grammar->comp_unit( 'class Moose { say(123, 456); 123 := 410; 123.moose(1) }' ); 
     7  print Dumper( $$p ); 
     8} 
     9 
     10{ 
     11  my $p = MiniPerl6::Grammar->val( '"moose"' ); 
     12  print Dumper( $$p ); 
     13} 
    414 
    515{