tagged release 0.6.4
[parrot.git] / languages / lolcode / src / builtins / expr_parse.pir
blob0d138df0e576490a0cac75209d7859d8d6139bed
1 =head1
3 expr_parse.pir - parse an expression and dispatch function calls with their appropriate arguments.
5 =cut
7 .namespace []
9 .sub 'setup_global_parsing_tokens' :init :load :anon
10     $P0 = new 'String'
11     $P0 = 'MKAY end of statement marker'
12     store_global 'MKAY', $P0
13 .end
15 .sub 'expr_parse'
16     .param pmc tokens :slurpy
18     .local pmc t_iter
19     t_iter = new 'Iterator', tokens
21     .local pmc sub_stack
22     .local pmc val_stack
23     .local pmc arity_stack
25     sub_stack = new 'ResizablePMCArray'
26     val_stack = new 'ResizablePMCArray'
27     arity_stack = new 'ResizableIntegerArray'
29     .local pmc mkay
30     mkay = find_name 'MKAY'
31   it_loop:
32     unless t_iter goto it_done
33       .local pmc item
34       .local pmc sub_to_call
35       .local pmc args_array
36       item = shift t_iter
37       unless_null item, not_found
38       item = new 'Undef'
39     not_found:
40       $I0 = isntsame item, mkay
41     if $I0 goto check_type
42       has_slurpy:
43       sub_to_call = pop sub_stack
44       $I0 = shift arity_stack
45       args_array = new 'ResizablePMCArray'
46       getting_varargs:
47         $P1 = pop val_stack
48         $I0 = issame $P1, mkay
49         if $I0 goto call_the_sub
50         unshift args_array, $P1
51         goto getting_varargs
52       got_varargs:
53     check_type:
54       $I0 = isa item, 'Sub'
55     unless $I0 goto has_val
56       $P0 = inspect item
57       $I2 = $P0['pos_slurpy']
58       unless $I2 goto no_slurpy
59         push sub_stack, item
60         unshift arity_stack, -1
61         push val_stack, mkay
62       goto end_fixed
63       no_slurpy:
64         $I1 = item.arity()
65         push sub_stack, item
66         unshift arity_stack, $I1
67       end_fixed:
68       goto skip_val
69     has_val:
70       push val_stack, item
71       $I0 = arity_stack[0]
72       $I0 -= 1
73       arity_stack[0] = $I0
74     skip_val:
75     call_check:
76       $I0 = arity_stack[0]
77       unless $I0 == 0 goto skip_call
78       sub_to_call = pop sub_stack
79       $I1 = sub_to_call.arity()
80       args_array = new 'ResizablePMCArray'
81     args_loop:
82       if $I1 == 0 goto args_loop_end
83       $I1 -= 1
84       $P1 = pop val_stack
85       unshift args_array, $P1
86       goto args_loop
87     args_loop_end:
88       $I2 = shift arity_stack
89       call_the_sub:
90       $P2 = sub_to_call(args_array :flat)
91       push val_stack, $P2
92       $I0 = arity_stack[0]
93       $I0 -= 1
94       arity_stack[0] = $I0
95       goto call_check
96     skip_call:
97     goto it_loop
98 it_done:
99     $I0 = elements sub_stack
100     if $I0 == 0 goto no_leftover_function
101     sub_to_call = pop sub_stack
102     args_array = new 'ResizablePMCArray'
103     $P2 = new 'Iterator', val_stack
104     getting_more_varargs:
105       $I1 = elements val_stack
106       unless $I1 goto got_more_varargs
107       $P1 = pop val_stack
108       $I0 = issame $P1, mkay
109       if $I0 goto got_more_varargs
110       unshift args_array, $P1
111       goto getting_more_varargs
112     got_more_varargs:
113     $P0 = sub_to_call(args_array :flat)
114     push val_stack, $P0
115     no_leftover_function:
116     .local pmc return_val
117     return_val = pop val_stack
118     .return (return_val)
119 .end
121 .sub lookup
122     .param string name
123     $P0 = find_name name
124     if_null $P0, null_token
125     $P0 = typeof $P0
126     .return($P0)
127   null_token:
128     .return("NULL")
129 .end
130 # Local Variables:
131 #   mode: pir
132 #   fill-column: 100
133 # End:
134 # vim: expandtab shiftwidth=4 ft=pir: