Implemented copy construction and destruction for the executable unit class.
[fridhskrift.git] / fridh / function.hpp
blob3b91504f8c0f200bdd085b6b7c45a408dde59ec2
1 #pragma once
3 #include <vector>
4 #include <string>
6 #include <ail/types.hpp>
8 namespace fridh
10 namespace executable_unit_type
12 enum type
14 uninitialised,
16 statement,
17 return_statement,
18 if_statement,
19 if_else_statement,
20 for_each_statement,
21 for_statement,
22 while_statement,
26 namespace unary_operator_type
28 enum type
30 negation,
31 logical_not,
32 binary_not,
34 increment,
35 decrement,
39 namespace binary_operator_type
41 enum type
43 addition,
44 subtraction,
45 multiplication,
46 division,
47 modulo,
48 exponentiation,
50 less_than,
51 less_than_or_equal,
52 greater_than,
53 greater_than_or_equal,
54 not_equal,
55 equal,
57 logical_and,
58 logical_or,
60 shift_left,
61 shift_right,
63 binary_and,
64 binary_or,
65 binary_xor,
67 selection,
69 assignment,
70 addition_assignment,
71 subtraction_assignment,
72 multiplication_assignment,
73 division_assignment,
74 modulo_assignment,
75 exponentiation_assignment,
79 namespace parse_tree_node_type
81 enum type
83 uninitialised,
85 variable,
86 symbol,
87 unary_operator_node,
88 binary_operator_node,
89 call,
90 array,
92 call_operator,
93 spaced_call_operator,
95 iterator,
99 namespace symbol_prefix
101 enum type
103 none,
104 scope_operator,
105 class_operator,
109 struct parse_tree_node;
110 struct parse_tree_symbol;
111 struct executable_unit;
113 typedef std::vector<parse_tree_node> parse_tree_nodes;
114 typedef std::vector<parse_tree_symbol> parse_tree_symbols;
115 typedef std::vector<executable_unit> executable_units;
117 struct parse_tree_symbol;
118 struct parse_tree_unary_operator_node;
119 struct parse_tree_binary_operator_node;
120 struct parse_tree_call;
121 struct parse_tree_array;
123 struct parse_tree_node
125 parse_tree_node_type::type type;
126 union
128 variable * variable_pointer;
129 parse_tree_symbol * symbol_pointer;
130 parse_tree_unary_operator_node * unary_operator_pointer;
131 parse_tree_binary_operator_node * binary_operator_pointer;
132 parse_tree_call * call_pointer;
133 parse_tree_array * array_pointer;
136 parse_tree_node();
137 parse_tree_node(parse_tree_node const & other);
138 ~parse_tree_node();
140 parse_tree_node(parse_tree_node_type::type type);
141 parse_tree_node(variable * variable_pointer);
142 parse_tree_node(unary_operator_type::type unary_operator);
143 parse_tree_node(binary_operator_type::type binary_operator);
144 parse_tree_node(parse_tree_nodes & elements);
146 void is_call();
148 bool is_post_fix() const;
151 struct parse_tree_symbol
153 std::string name;
154 symbol_prefix::type type;
156 parse_tree_symbol();
159 struct parse_tree_unary_operator_node
161 unary_operator_type::type type;
162 parse_tree_node argument;
165 struct parse_tree_binary_operator_node
167 binary_operator_type::type type;
168 parse_tree_node
169 left_argument,
170 right_argument;
173 struct parse_tree_call
175 parse_tree_node function;
176 parse_tree_nodes arguments;
179 struct parse_tree_array
181 parse_tree_nodes elements;
184 struct if_statement
186 parse_tree_node conditional_term;
187 executable_units body;
190 struct if_else_statement
192 parse_tree_node conditional_term;
193 executable_units
194 if_body,
195 else_body;
198 struct for_each_statement
200 parse_tree_node container;
201 executable_units body;
204 struct for_statement
206 parse_tree_node
207 initialisation,
208 conditional,
209 iteration;
210 executable_units body;
213 struct while_statement
215 parse_tree_node conditional_term;
216 executable_units body;
219 struct executable_unit
221 executable_unit_type::type type;
223 union
225 parse_tree_node * statement_pointer;
226 if_statement * if_pointer;
227 if_else_statement * if_else_pointer;
228 for_each_statement * for_each_pointer;
229 for_statement * for_pointer;
230 while_statement * while_pointer;
233 executable_unit();
234 executable_unit(executable_unit const & other);
235 ~executable_unit();
238 struct function
240 string_vector arguments;
241 executable_units body;