tagged release 0.6.4
[parrot.git] / languages / lua / src / PASTGrammar.tg
blobd15f7a7e8bd7e23ab71125533eda6e5515f46fa9
1 # Copyright (C) 2006-2008, The Perl Foundation.
2 # $Id$
4 =head1 NAME
6 PASTGrammar.tg - A grammar for transforming the output of a PGE parse
7 into an abstract syntax tree (PAST).
9 =head1 DESCRIPTION
12 =cut
14 grammar Lua::PAST::Grammar is TGE::Grammar;
17 transform past (ROOT) :language('PIR') {
18     new $P0, 'Integer'
19     set $P0, 0
20     set_hll_global ['Lua::PAST'], '$looplevel', $P0
21     new $P0, 'Boolean'
22     set $P0, 1
23     set_hll_global ['Lua::PAST'], '?vararg', $P0
24     .local pmc symbtab
25     new symbtab, 'Lua::Symbtab'
26     symbtab.'push_scope'()
27     set_hll_global ['Lua::PAST'], '$symbtab', symbtab
28     .local pmc past
29     $P0 = node['block']
30     past = tree.'get'('past', $P0, 'Lua::Grammar::block')
31     $I0 = symbtab
32     if $I0 goto L1
33     .local pmc arg
34     $P0 = get_hll_global ['PAST'], 'Var'
35     arg = $P0.'new'('node'=>node, 'name'=>'vararg', 'scope'=>'parameter', 'slurpy'=>1)
36     $P0 = get_hll_global ['PAST'], 'Block'
37     .return $P0.'new'(arg, past, 'node'=>node, 'name'=>'&main')
38   L1:
39     $S1 = $I0
40     $S0 = "symbol table (" . $S1
41     $S0 .= ")"
42     internal_error($S0)
46 transform past (Lua::Grammar::block) :language('PIR') {
47     .local pmc past
48     $P0 = get_hll_global ['PAST'], 'Stmts'
49     past = $P0.'new'('node'=>node)
50     $P0 = node['statement']
51     if null $P0 goto L1
52     .local pmc iter, cpast
53     new iter, 'Iterator', $P0
54   L2:
55     unless iter goto L1
56     $P0 = shift iter
57     cpast = tree.'get'('past', $P0, 'Lua::Grammar::statement')
58     past.'push'(cpast)
59     goto L2
60   L1:
61     $P0 = node['last_statement']
62     if null $P0 goto L3
63     $P0 = shift $P0
64     cpast = tree.'get'('past', $P0, 'Lua::Grammar::statement')
65     past.'push'(cpast)
66   L3:
67     .local pmc symbtab
68     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
69     symbtab.'pop_scope'()
70     .return (past)
74 transform past (Lua::Grammar::statement) :language('PIR') {
75     $S0 = node.'find_key'()
76     $P0 = node[$S0]
77     $S0 = concat 'Lua::Grammar::', $S0
78     .return tree.'get'('past', $P0, $S0)
82 transform past (Lua::Grammar::do_block) :language('PIR') {
83     .local pmc symbtab
84     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
85     symbtab.'push_scope'()
86     $P0 = node['block']
87     .return tree.'get'('past', $P0, 'Lua::Grammar::block')
91 transform past (Lua::Grammar::if_stat) :language('PIR') {
92     .local pmc expr
93     $P0 = node['expression']
94     expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
95     .local pmc symbtab
96     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
97     symbtab.'push_scope'()
98     .local pmc past, cpast, blk
99     $P0 = node['block']
100     blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
101     $P0 = get_hll_global ['PAST'], 'Op'
102     past = $P0.'new'(expr, blk, 'node'=>node, 'pasttype'=>'if')
103     cpast = past
104     $P0 = node['elseif_block']
105     if null $P0 goto L1
106     .local pmc iter
107     new iter, 'Iterator', $P0
108   L2:
109     unless iter goto L1
110     $P0 = shift iter
111     $P1 = tree.'get'('past', $P0, 'Lua::Grammar::elseif_block')
112     cpast.'push'($P1)
113     cpast = $P1
114     goto L2
115   L1:
116     $P0 = node['else_block']
117     if null $P0 goto L3
118     symbtab.'push_scope'()
119     $P0 = shift $P0
120     $P0 = $P0['block']
121     blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
122     cpast.'push'(blk)
123   L3:
124     .return (past)
128 transform past (Lua::Grammar::elseif_block) :language('PIR') {
129     .local pmc expr
130     $P0 = node['expression']
131     expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
132     .local pmc symbtab
133     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
134     symbtab.'push_scope'()
135     .local pmc blk
136     $P0 = node['block']
137     blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
138     $P0 = get_hll_global ['PAST'], 'Op'
139     .return $P0.'new'(expr, blk, 'node'=>node, 'pasttype'=>'if')
143 transform past (Lua::Grammar::while_stat) :language('PIR') {
144     .local pmc looplevel
145     looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
146     inc looplevel
147     .local pmc expr
148     $P0 = node['expression']
149     expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
150     .local pmc symbtab
151     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
152     symbtab.'push_scope'()
153     .local pmc blk
154     $P0 = node['block']
155     blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
156     dec looplevel
157     $P0 = get_hll_global ['PAST'], 'Op'
158     .return $P0.'new'(expr, blk, 'node'=>node, 'pasttype'=>'while')
162 transform past (Lua::Grammar::repeat_stat) :language('PIR') {
163     .local pmc looplevel
164     looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
165     inc looplevel
166     .local pmc symbtab
167     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
168     symbtab.'push_scope'()
169     .local pmc blk
170     $P0 = node['block']
171     blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
172     .local pmc expr
173     $P0 = node['expression']
174     expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
175     dec looplevel
176     $P0 = get_hll_global ['PAST'], 'Op'
177     .return $P0.'new'(blk, expr, 'node'=>node, 'pasttype'=>'repeat')
181 transform past (Lua::Grammar::for_stat) :language('PIR') {
182     .local pmc looplevel
183     looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
184     inc looplevel
185     .local pmc past
186     $S0 = node.'find_key'()
187     $P0 = node[$S0]
188     $S1 = concat 'Lua::Grammar::', $S0
189     past = tree.'get'('past', $P0, $S1)
190     .local pmc blk
191     $P0 = node['for_body']
192     $P0 = $P0['block']
193     blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
194     dec looplevel
195     past.'push'(blk)
196     .return (past)
200 transform past (Lua::Grammar::fornum) :language('PIR') {
201     .local pmc symbtab
202     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
203     symbtab.'push_scope'()
204     $P0 = node['Name']
205     $S0 = $P0.'result_object'()
206     .local pmc name
207     $S1 = symbtab.'insert'($S0)
208     $P0 = get_hll_global ['PAST'], 'Var'
209     name = $P0.'new'('node'=>node, 'name'=>$S1, 'scope'=>'lexical', 'isdecl'=>1, 'lvalue'=>1)
210     .local pmc explist
211     new explist, 'ResizablePMCArray'
212     $P0 = node['expression']
213     $I0 = $P0
214     .local pmc iter, expr
215     new iter, 'Iterator', $P0
216   L1:
217     unless iter goto L2
218     $P0 = shift iter
219     expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
220     push explist, expr
221     goto L1
222   L2:
223     unless $I0 < 3 goto L3
224     $P0 = get_hll_global ['PAST'], 'Val'
225     expr = $P0.'new'('node'=>node, 'name'=>'LuaNumber', 'value'=>'1')
226     push explist, expr
227   L3:
228     $P0 = get_hll_global ['PAST'], 'Op'
229     .return $P0.'new'(name, explist, 'node'=>node, 'pasttype'=>'fornum')
233 transform past (Lua::Grammar::forlist) :language('PIR') {
234     .local pmc symbtab
235     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
236     symbtab.'push_scope'()
237     .local pmc namelist
238     new namelist, 'ResizablePMCArray'
239     $P0 = node['name_list']
240     $P0 = $P0['Name']
241     .local pmc iter, cpast
242     new iter, 'Iterator', $P0
243   L1:
244     unless iter goto L2
245     $P0 = shift iter
246     $S0 = $P0.'result_object'()
247     $S1 = symbtab.'insert'($S0)
248     $P0 = get_hll_global ['PAST'], 'Var'
249     cpast = $P0.'new'('node'=>node, 'name'=>$S1, 'scope'=>'lexical', 'isdecl'=>1, 'lvalue'=>1)
250     push namelist, cpast
251     goto L1
252   L2:
253     $P0 = node['expression_list']
254     .local pmc explist
255     explist = tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
256     $P0 = get_hll_global ['PAST'], 'Op'
257     .return $P0.'new'(namelist, explist, 'node'=>node, 'pasttype'=>'forlist')
261 transform past (Lua::Grammar::local_stat) :language('PIR') {
262     $S0 = node.'find_key'()
263     $P0 = node[$S0]
264     $S0 = concat 'Lua::Grammar::', $S0
265     .return tree.'get'('past', $P0, $S0)
269 transform past (Lua::Grammar::local_declaration) :language('PIR') {
270     .local pmc symbtab
271     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
272     .local pmc explist
273     $P0 = node['expression_list']
274     if null $P0 goto L1
275     $P0 = shift $P0
276     explist = tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
277   L1:
278     unless null explist goto L2
279     new explist, 'ResizablePMCArray'
280   L2:
281     $P0 = node['Name']
282     .local pmc namelist
283     new namelist, 'ResizablePMCArray'
284     .local pmc iter, cpast
285     new iter, 'Iterator', $P0
286   L3:
287     unless iter goto L4
288     $P0 = shift iter
289     $S0 = $P0.'result_object'()
290     $S1 = symbtab.'insert'($S0)
291     $P0 = get_hll_global ['PAST'], 'Var'
292     cpast = $P0.'new'('node'=>node, 'name'=>$S1, 'scope'=>'lexical', 'isdecl'=>1, 'lvalue'=>1)
293     push namelist, cpast
294     goto L3
295   L4:
296     $P0 = get_hll_global ['PAST'], 'Op'
297     .return $P0.'new'(namelist, explist, 'node'=>node, 'pasttype'=>'assignlist')
301 transform past (Lua::Grammar::local_function) :language('PIR') {
302     .local pmc symbtab
303     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
304     .local pmc var
305     $P0 = node['Name']
306     $S0 = $P0.'result_object'()
307     $S1 = symbtab.'insert'($S0)
308     $P1 = get_hll_global ['PAST'], 'Var'
309     var = $P1.'new'('node'=>$P0, 'name'=>$S1, 'scope'=>'lexical', 'isdecl'=>1, 'lvalue'=>1)
310     .local pmc past
311     $P0 = node['function_body']
312     past = tree.'get'('past', $P0, 'Lua::Grammar::function_body')
313     past.'name'($S0)
314     $P0 = get_hll_global ['PAST'], 'Op'
315     $P1 = $P0.'new'(var, past, 'node'=>node, 'pasttype'=>'assign')
316     .return ($P1)
320 transform past (Lua::Grammar::return_statement) :language('PIR') {
321     $P1 = get_hll_global ['PAST'], 'Op'
322     $P0 = node['expression_list']
323     if null $P0 goto L1
324     .local pmc explist
325     $P0 = shift $P0
326     explist = tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
327     .return $P1.'new'(explist :flat, 'node'=>node, 'pasttype'=>'return')
328   L1:
329     .return $P1.'new'('node'=>node, 'pasttype'=>'return')
333 transform past (Lua::Grammar::break_statement) :language('PIR') {
334     .local pmc looplevel
335     looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
336     if looplevel <= 0 goto L1
337     $P0 = get_hll_global ['PAST'], 'Op'
338     .return $P0.'new'('node'=>node, 'pasttype'=>'break')
339   L1:
340     node.'syntaxerror'("no loop to break")
344 transform past (Lua::Grammar::expression_stat) :language('PIR') {
345     $P0 = node['assignment']
346     unless null $P0 goto L1
347     $P0 = node['primary_expression']
348     .return tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
349   L1:
350     .local pmc varlist, explist
351     $P0 = shift $P0
352     explist = tree.'get'('explist', $P0, 'Lua::Grammar::assignment')
353     varlist = tree.'get'('varlist', $P0, 'Lua::Grammar::assignment')
354     .local pmc expr
355     $P0 = node['primary_expression']
356     expr = tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
357     expr.'lvalue'(1)
358     unshift varlist, expr
359     $P0 = get_hll_global ['PAST'], 'Op'
360     .return $P0.'new'(varlist, explist, 'node'=>node, 'pasttype'=>'assignlist')
364 transform varlist (Lua::Grammar::assignment) :language('PIR') {
365     .local pmc varlist
366     $P0 = node['expression_list']
367     if null $P0 goto L1
368     new varlist, 'ResizablePMCArray'
369     .return (varlist)
370   L1:
371     $P0 = node['assignment']
372     varlist = tree.'get'('varlist', $P0, 'Lua::Grammar::assignment')
373     .local pmc expr
374     $P0 = node['primary_expression']
375     expr = tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
376     expr.'lvalue'(1)
377     unshift varlist, expr
378     .return (varlist)
382 transform explist (Lua::Grammar::assignment) :language('PIR') {
383     $P0 = node['expression_list']
384     if null $P0 goto L1
385     .return tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
386   L1:
387     $P0 = node['assignment']
388     .return tree.'get'('explist', $P0, 'Lua::Grammar::assignment')
392 transform explist (Lua::Grammar::function_args) :language('PIR') {
393     .local pmc explist, past
394     $P0 = node['constructor']
395     if null $P0 goto L1
396     past = tree.'get'('past', $P0, 'Lua::Grammar::constructor')
397     new explist, 'ResizablePMCArray'
398     push explist, past
399     .return (explist)
400   L1:
401     $P0 = node['string']
402     if null $P0 goto L2
403     past = tree.'get'('past', $P0, 'Lua::Grammar::string')
404     new explist, 'ResizablePMCArray'
405     push explist, past
406     .return (explist)
407   L2:
408     $P0 = node['expression_list']
409     unless null $P0 goto L3
410     new explist, 'ResizablePMCArray'
411     .return (explist)
412   L3:
413     $P0 = shift $P0
414     .return tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
418 transform past (Lua::Grammar::function_stat) :language('PIR') {
419     .local pmc symbtab
420     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
421     .local pmc past, var
422     $P0 = node['functionname']
423     var = tree.'get'('past', $P0, 'Lua::Grammar::functionname')
424     $S0 = $P0.'result_object'()
425     $I0 = index $S0, ':'
426     if $I0 < 0 goto L1
427     $P1 = get_hll_global ['PAST'], 'Var'
428     $S1 = symbtab.'insert'('self')
429     past = $P1.'new'('node'=>$P0, 'name'=>$S1, 'scope'=>'parameter')
430     set_hll_global ['Lua::PAST'], '$?self', past
431   L1:
432     $S0 = tree.'get'('Name', $P0, 'Lua::Grammar::functionname')
433     $P0 = node['function_body']
434     past = tree.'get'('past', $P0, 'Lua::Grammar::function_body')
435     past.'name'($S0)
436     $P0 = get_hll_global ['PAST'], 'Op'
437     .return $P0.'new'(var, past, 'node'=>node, 'pasttype'=>'assign')
441 transform Name (Lua::Grammar::functionname) :language('PIR') {
442     .local string name
443     name = ''
444     $P0 = node['Name']
445     .local pmc iter
446     new iter, 'Iterator', $P0
447   L2:
448     unless iter goto L1
449     if name == '' goto L3
450     name = concat '.'
451   L3:
452     $P0 = shift iter
453     $S0 = $P0.'result_object'()
454     name = concat $S0
455     goto L2
456   L1:
457     .return (name)
461 transform past (Lua::Grammar::functionname) :language('PIR') {
462     .local pmc symbtab
463     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
464     .local pmc iter
465     $P0 = node['Name']
466     new iter, 'Iterator', $P0
467     $P0 = shift iter
468     $S0 = $P0.'result_object'()
469     .local pmc past
470     $P0 = get_hll_global ['PAST'], 'Var'
471     ($I0, $S1) = symbtab.'lookup'($S0)
472     unless $I0 goto L1
473     past = $P0.'new'('node'=>node, 'name'=>$S1, 'scope'=>'lexical')
474     goto L2
475   L1:
476     past = $P0.'new'('node'=>node, 'name'=>$S0, 'scope'=>'package')
477   L2:
478     unless iter goto L3
479     $P0 = shift iter
480     $S0 = $P0.'result_object'()
481     .local pmc key
482     $P1 = get_hll_global ['PAST'], 'Val'
483     key = $P1.'new'('node'=>$P0, 'name'=>'key', 'value'=>$S0)
484     $P0 = get_hll_global ['PAST'], 'Var'
485     past = $P0.'new'(past, key, 'node'=>node, 'scope'=>'keyed')
486     goto L2
487   L3:
488     past.'lvalue'(1)
489     .return (past)
493 transform past (Lua::Grammar::function_body) :language('PIR') {
494     .local pmc symbtab
495     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
496     symbtab.'push_scope'()
497     .local pmc parlist
498     new parlist, 'ResizablePMCArray'
499     .local pmc var
500     var = get_hll_global ['Lua::PAST'], '$?self'
501     if null var goto L1
502     push parlist, var
503     null var
504     set_hll_global ['Lua::PAST'], '$?self', var
505   L1:
506     $P0 = node['parameter_list']
507     if null $P0 goto L2
508     $P1 = $P0['name_list']
509     if null $P1 goto L3
510     $P1 = $P1['Name']
511     .local pmc iter
512     new iter, 'Iterator', $P1
513   L4:
514     unless iter goto L3
515     $P1 = shift iter
516     $S0 = $P1.'result_object'()
517     $S1 = symbtab.'insert'($S0)
518     $P2 = get_hll_global ['PAST'], 'Var'
519     var = $P2.'new'('node'=>$P1, 'name'=>$S1, 'scope'=>'parameter')
520     push parlist, var
521     goto L4
522   L3:
523     $P1 = $P0['vararg']
524     $I0 = 0
525     if null $P1 goto L2
526     $P1 = shift $P1
527     $P2 = get_hll_global ['PAST'], 'Var'
528     var = $P2.'new'('node'=>$P1, 'name'=>'vararg', 'scope'=>'parameter', 'slurpy'=>1)
529     push parlist, var
530     $I0 = 1
531     goto L5
532   L2:
533     $P2 = get_hll_global ['PAST'], 'Var'
534     var = $P2.'new'('node'=>$P0, 'name'=>'extra', 'scope'=>'parameter', 'slurpy'=>1)
535     push parlist, var
536   L5:
537     .local pmc has_vararg
538     has_vararg = get_hll_global ['Lua::PAST'], '?vararg'
539     new $P0, 'Boolean'
540     set $P0, $I0
541     set_hll_global ['Lua::PAST'], '?vararg', $P0
542     .local pmc looplevel
543     looplevel = get_hll_global ['Lua::PAST'], '$looplevel'
544     new $P0, 'Integer'
545     set $P0, 0
546     set_hll_global ['Lua::PAST'], '$looplevel', $P0
547     .local pmc past
548     $P0 = node['block']
549     past = tree.'get'('past', $P0, 'Lua::Grammar::block')
550     set_hll_global ['Lua::PAST'], '$looplevel', looplevel
551     set_hll_global ['Lua::PAST'], '?vararg', has_vararg
552     $P0 = get_hll_global ['PAST'], 'Block'
553     .return $P0.'new'(parlist :flat, past, 'node'=>node)
557 transform past (Lua::Grammar::constructor) :language('PIR') {
558     .local pmc past
559     $P0 = get_hll_global ['PAST'], 'Val'
560     past = $P0.'new'('node'=>node, 'name'=>'constructor')
561     $P0 = node['tablefieldlist']
562     if null $P0 goto L1
563     $P0 = shift $P0
564     $P0 = $P0['tablefield']
565     .local pmc iter, field
566     $I0 = 1
567     new iter, 'Iterator', $P0
568   L2:
569     unless iter goto L1
570     $P0 = shift iter
571     $S0 = $P0.'find_key'()
572     $P0 = $P0[$S0]
573     unless $S0 == 'expression' goto L3
574     field = tree.'get'('past', $P0, 'Lua::Grammar::expression')
575     past.'push'(field)
576     goto L2
577   L3:
578     $S0 = concat 'Lua::Grammar::', $S0
579     field = tree.'get'('record', $P0, $S0)
580     past.'push'(field)
581     goto L2
582   L1:
583     .return (past)
587 transform record (Lua::Grammar::record_field) :language('PIR') {
588     .local pmc record
589     new record, 'FixedPMCArray'
590     set record, 2
591     $S0 = node.'find_key'()
592     $P0 = node[$S0]
593     $S0 = concat 'Lua::Grammar::', $S0
594     $P1 = tree.'get'('key', $P0, $S0)
595     record[0] = $P1
596     $P0 = node['expression']
597     $P1 = tree.'get'('past', $P0, 'Lua::Grammar::expression')
598     record[1] = $P1
599     .return (record)
603 transform key (Lua::Grammar::Name) :language('PIR') {
604     $S0 = node.'result_object'()
605     $P0 = get_hll_global ['PAST'], 'Val'
606     .return $P0.'new'('node'=>node, 'name'=>'key', 'value'=>$S0)
610 transform key (Lua::Grammar::index) :language('PIR') {
611     $P0 = node['expression']
612     .return tree.'get'('past', $P0, 'Lua::Grammar::expression')
616 transform explist (Lua::Grammar::expression_list) :language('PIR') {
617     .local pmc explist
618     new explist, 'ResizablePMCArray'
619     $P0 = node['expression']
620     .local pmc iter, expr
621     new iter, 'Iterator', $P0
622   L1:
623     unless iter goto L2
624     $P0 = shift iter
625     expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
626     push explist, expr
627     goto L1
628   L2:
629     .return (explist)
633 transform past (Lua::Grammar::expression) :language('PIR') {
634     $P0 = node['expr']
635     .return tree.'get'('past', $P0, 'Lua::Grammar::expr')
639 transform past (Lua::Grammar::expr) :language('PIR') {
640     .local string type
641     type = node['type']
642     unless type == 'term:' goto L1
643     $S0 = node.'find_key'()
644     $P0 = node[$S0]
645     $S0 = concat 'Lua::Grammar::', $S0
646     .return tree.'get'('past', $P0, $S0)
647   L1:
648     .local pmc optable, optok
649     .local string pirop
650     optable = get_hll_global [ 'Lua::Grammar' ], '$optable'
651     optok = optable[type]
652     pirop = optok['pirop']
653     .local pmc past
654     $P0 = get_hll_global ['PAST'], 'Op'
655     if pirop == '' goto L2
656     past = $P0.'new'('node'=>node, 'name'=>type, 'pasttype'=>'pirop', 'pirop'=>pirop)
657     goto L3
658   L2:
659     $S0 = optok['past']
660     past = $P0.'new'('node'=>node, 'name'=>type, 'pasttype'=>$S0)
661   L3:
662     $P0 = node.'list'()
663     .local pmc iter, expr
664     new iter, 'Iterator', $P0
665   L5:
666     unless iter goto L4
667     $P0 = shift iter
668     expr = tree.'get'('past', $P0, 'Lua::Grammar::expr')
669     past.'push'(expr)
670     goto L5
671   L4:
672     .return (past)
676 transform past (Lua::Grammar::simple_expression) :language('PIR') {
677     $S0 = node.'find_key'()
678     $P0 = node[$S0]
679     $S0 = concat 'Lua::Grammar::', $S0
680     .return tree.'get'('past', $P0, $S0)
684 transform past (Lua::Grammar::primary_expression) :language('PIR') {
685     .local pmc past
686     $P0 = node['prefix_expression']
687     past = tree.'get'('past', $P0, 'Lua::Grammar::prefix_expression')
688     $P0 = node['slice_expression']
689     if null $P0 goto L1
690     .local pmc iter, key, args
691     new iter, 'Iterator', $P0
692   L2:
693     unless iter goto L1
694     $P0 = shift iter
695     $P1 = $P0['function_args']
696     if null $P1 goto L3
697     args = tree.'get'('explist', $P1, 'Lua::Grammar::function_args')
698     $P1 = $P0['Name']
699     if null $P1 goto L4
700     .local pmc meth, obj
701     key = tree.'get'('key', $P1, 'Lua::Grammar::Name')
702     $P2 = get_hll_global ['PAST'], 'Var'
703     meth = $P2.'new'(past, key, 'node'=>node, 'scope'=>'keyed')
704     obj = clone past
705     $P2 = get_hll_global ['PAST'], 'Op'
706     past = $P2.'new'(meth, obj, args :flat, 'node'=>node, 'pasttype'=>'call')
707     goto L2
708   L4:
709     $P2 = get_hll_global ['PAST'], 'Op'
710     past = $P2.'new'(past, args :flat, 'node'=>node, 'pasttype'=>'call')
711     goto L2
712   L3:
713     $P1 = $P0['Name']
714     if null $P1 goto L5
715     key = tree.'get'('key', $P1, 'Lua::Grammar::Name')
716     $P2 = get_hll_global ['PAST'], 'Var'
717     past = $P2.'new'(past, key, 'node'=>node, 'scope'=>'keyed')
718     goto L2
719   L5:
720     $P1 = $P0['index']
721     if null $P1 goto L6
722     key = tree.'get'('key', $P1, 'Lua::Grammar::index')
723     $P2 = get_hll_global ['PAST'], 'Var'
724     past = $P2.'new'(past, key, 'node'=>node, 'scope'=>'keyed')
725     goto L2
726   L6:
727     internal_error("primary expression")
728   L1:
729     .return (past)
733 transform past (Lua::Grammar::prefix_expression) :language('PIR') {
734     $S0 = node.'find_key'()
735     $P0 = node[$S0]
736     $S0 = concat 'Lua::Grammar::', $S0
737     .return tree.'get'('past', $P0, $S0)
741 transform past (Lua::Grammar::parenthesed_expression) :language('PIR') {
742     .local pmc past
743     $P0 = node['expression']
744     past = tree.'get'('past', $P0, 'Lua::Grammar::expression')
745     $P0 = get_hll_global ['PAST'], 'Op'
746     .return $P0.'new'(past, 'node'=>node, 'pasttype'=>'parenthese')
750 transform past (Lua::Grammar::Name) :language('PIR') {
751     .local pmc symbtab
752     symbtab = get_hll_global ['Lua::PAST'], '$symbtab'
753     $P0 = get_hll_global ['PAST'], 'Var'
754     $S0 = node.'result_object'()
755     ($I0, $S1) = symbtab.'lookup'($S0)
756     unless $I0 goto L1
757     .return $P0.'new'('node'=>node, 'name'=>$S1, 'scope'=>'lexical')
758   L1:
759     .return $P0.'new'('node'=>node, 'name'=>$S0, 'scope'=>'package')
763 transform past (Lua::Grammar::vararg) :language('PIR') {
764     .local pmc has_vararg
765     has_vararg = get_hll_global ['Lua::PAST'], '?vararg'
766     unless has_vararg goto L1
767     $P0 = get_hll_global ['PAST'], 'Op'
768     .return $P0.'new'('node'=>node, 'pasttype'=>'vararg')
769   L1:
770     node.'syntaxerror'("cannot use '...' outside a vararg function")
774 transform past (Lua::Grammar::nil) :language('PIR') {
775     $P0 = get_hll_global ['PAST'], 'Val'
776     .return $P0.'new'('node'=>node, 'name'=>'LuaNil')
780 transform past (Lua::Grammar::true) :language('PIR') {
781     $P0 = get_hll_global ['PAST'], 'Val'
782     .return $P0.'new'('node'=>node, 'name'=>'LuaBoolean', 'value'=>1)
786 transform past (Lua::Grammar::false) :language('PIR') {
787     $P0 = get_hll_global ['PAST'], 'Val'
788     .return $P0.'new'('node'=>node, 'name'=>'LuaBoolean', 'value'=>0)
792 transform past (Lua::Grammar::number) :language('PIR') {
793     $S0 = node.'result_object'()
794     $P0 = get_hll_global ['PAST'], 'Val'
795     .return $P0.'new'('node'=>node, 'name'=>'LuaNumber', 'value'=>$S0)
799 transform past (Lua::Grammar::string) :language('PIR') {
800     $S0 = node.'find_key'()
801     $P0 = node[$S0]
802     $S0 = $P0.'result_object'()
803     $P0 = get_hll_global ['PAST'], 'Val'
804     .return $P0.'new'('node'=>node, 'name'=>'LuaString', 'value'=>$S0)
807 =head1 AUTHORS
809 Klaas-Jan Stol <parrotcode@gmail.com>
811 Francois Perrad
813 =cut