Changeset 14598
- Timestamp:
- 11/03/06 02:14:10 (2 years ago)
- svk:copy_cache_prev:
- 41990
- Location:
- v6/v6-MiniPerl6
- Files:
-
- 2 modified
-
lib/MiniPerl6/Grammar.pm (modified) (11 diffs)
-
t/01-sanity.t (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
v6/v6-MiniPerl6/lib/MiniPerl6/Grammar.pm
r14597 r14598 19 19 sub Val::Int($data) { use v5; bless $data, 'Val::Int'; use v6; } 20 20 sub Val::Num($data) { use v5; bless $data, 'Val::Num'; use v6; } 21 sub Val::Buf($data) { use v5; bless $data, 'Val::Buf'; use v6; } 21 22 22 23 # XXX - move to v6.pm emitter … … 25 26 token comp_unit { 26 27 <?ws>? 27 class <?ws>? <ident> \{ 28 class <?ws>? <ident> <?ws>? \{ 29 <?ws>? 30 <exp_stmts> 28 31 <?ws>? 29 32 \} … … 31 34 { 32 35 return CompUnit({ 33 name =>$<ident>,34 attributes => {},35 methods => {},36 body => {},36 name => $$<ident>, 37 attributes => {}, 38 methods => {}, 39 body => $$<exp_stmts>, 37 40 }) 38 41 } … … 40 43 41 44 token 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 63 token 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 75 token index { XXX } 76 token lookup { XXX } 52 77 53 78 token control { 54 [ $<exp> := <call> # $obj.method($arg1, $arg2) 55 | $<exp> := <apply> # $obj($arg1, $arg2) 56 | $<exp> := <return> # return 123; 79 [ $<exp> := <return> # return 123; 57 80 | $<exp> := <leave> # last; break; 58 81 | $<exp> := <if> # 1 ?? 2 !! 3 … … 60 83 | $<exp> := <for> # $x.map(-> $i {...}) 61 84 | $<exp> := <while> # while ... { ... } 85 | $<exp> := <apply> # $obj($arg1, $arg2) 86 # | $<exp> := <call> # $obj.method($arg1, $arg2) 62 87 ] 63 88 { return $$<exp> } … … 66 91 token if { 67 92 if <?ws> $<cond> := <exp> <?ws>? 68 \{ <?ws>? $<body> := <exp_s eq> <?ws>? \} <?ws>?93 \{ <?ws>? $<body> := <exp_stmts> <?ws>? \} <?ws>? 69 94 else <?ws>? 70 \{ <?ws>? $<otherwise> := <exp_s eq> <?ws>? \}95 \{ <?ws>? $<otherwise> := <exp_stmts> <?ws>? \} 71 96 { return If({ :$$<cond>, :$$<body>, :$$<otherwise> }) } 72 97 } 73 98 74 99 token when { 75 when <?ws> $<parameters> := <exp_seq> <?ws>? \{ <?ws>? $<body> := <exp_s eq> <?ws>? \}100 when <?ws> $<parameters> := <exp_seq> <?ws>? \{ <?ws>? $<body> := <exp_stmts> <?ws>? \} 76 101 { return When({ :$$<parameters>, :$$<body> }) } 77 102 } 78 103 79 104 token for { 80 for <?ws> <exp> <?ws>? <'->'> <?ws>? <var> <?ws> \{ <?ws>? <exp_s eq> <?ws>? \}81 { return For({ cond => $$<exp>, topic => $$<var>, body => $$<exp_s eq> }) }105 for <?ws> <exp> <?ws>? <'->'> <?ws>? <var> <?ws> \{ <?ws>? <exp_stmts> <?ws>? \} 106 { return For({ cond => $$<exp>, topic => $$<var>, body => $$<exp_stmts> }) } 82 107 } 83 108 84 109 token 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 114 token leave { 115 leave 116 { return Leave({}) } 87 117 } 88 118 … … 119 149 } 120 150 151 token val_bit { 152 | True \b { return Val::Bit( { bit => 0 } ) } 153 | False \b { return Val::Bit( { bit => 1 } ) } 154 } 155 121 156 token val_undef { 122 157 undef … … 124 159 } 125 160 161 token val_num { XXX { return "TODO: val_num" } } 162 token val_buf { 163 | \" (<-[\"]>+) \" { return Val::Buf( { buf => $$0 } ) } 164 | \' (<-[\']>+) \' { return Val::Buf( { buf => $$0 } ) } 165 } 166 126 167 token val_int { 127 168 \d+ … … 129 170 } 130 171 172 token 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 131 183 token 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 [] } 138 192 } 139 193 … … 159 213 } 160 214 215 token lit_seq { XXX { return "TODO: lit_seq" } } 216 token lit_array { XXX { return "TODO: lit_array" } } 217 token lit_hash { XXX { return "TODO: lit_hash" } } 218 161 219 token lit_code { 162 { die"TODO - Lit::Code" }220 XXX { return "TODO - Lit::Code" } 163 221 } 164 222 … … 197 255 } 198 256 } 257 199 258 token apply { 200 <ident> \( <?ws>? <exp_seq> <?ws>? \) 259 <ident> 260 [ \( <?ws>? <exp_seq> <?ws>? \) 261 | <?ws> <exp_seq> <?ws>? 262 ] 201 263 { 202 264 return Apply({ -
v6/v6-MiniPerl6/t/01-sanity.t
r14597 r14598 2 2 use MiniPerl6::Grammar; 3 3 use 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 } 4 14 5 15 {
