Worked out the post fix operator issue, I think. Just realised that I forgot to tag...
[fridhskrift.git] / fridh / function.hpp
blobbc7ddfc098ddeb9742e2f8b3e76c34d23a5c5bce
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 statement,
15 return_statement,
16 if_statement,
17 if_else_statement,
18 for_each_statement,
19 for_statement,
20 while_statement,
24 namespace unary_operator_type
26 enum type
28 negation,
29 logical_not,
30 binary_not,
32 increment,
33 decrement,
37 namespace binary_operator_type
39 enum type
41 addition,
42 subtraction,
43 multiplication,
44 division,
45 modulo,
46 exponentiation,
48 less_than,
49 less_than_or_equal,
50 greater_than,
51 greater_than_or_equal,
52 not_equal,
53 equal,
55 logical_and,
56 logical_or,
58 shift_left,
59 shift_right,
61 binary_and,
62 binary_or,
63 binary_xor,
65 selection,
67 assignment,
68 addition_assignment,
69 subtraction_assignment,
70 multiplication_assignment,
71 division_assignment,
72 modulo_assignment,
73 exponentiation_assignment,
77 namespace parse_tree_node_type
79 enum type
81 uninitialised,
83 variable,
84 symbol,
85 unary_operator_node,
86 binary_operator_node,
87 call,
88 array,
90 call_operator,
91 spaced_call_operator,
93 iterator,
97 namespace symbol_prefix
99 enum type
101 none,
102 scope_operator,
103 class_operator,
107 struct parse_tree_node;
108 struct parse_tree_symbol;
109 struct executable_unit;
111 typedef std::vector<parse_tree_node> parse_tree_nodes;
112 typedef std::vector<parse_tree_symbol> parse_tree_symbols;
113 typedef std::vector<executable_unit> executable_units;
115 struct parse_tree_symbol;
116 struct parse_tree_unary_operator_node;
117 struct parse_tree_binary_operator_node;
118 struct parse_tree_call;
119 struct parse_tree_array;
121 struct parse_tree_node
123 parse_tree_node_type::type type;
124 union
126 variable * variable_pointer;
127 parse_tree_symbol * symbol_pointer;
128 parse_tree_unary_operator_node * unary_operator_pointer;
129 parse_tree_binary_operator_node * binary_operator_pointer;
130 parse_tree_call * call_pointer;
131 parse_tree_array * array_pointer;
134 parse_tree_node();
135 parse_tree_node(parse_tree_node_type::type type);
136 parse_tree_node(variable * variable_pointer);
137 parse_tree_node(unary_operator_type::type unary_operator);
138 parse_tree_node(binary_operator_type::type binary_operator);
139 parse_tree_node(parse_tree_nodes & elements);
141 void is_call();
143 bool is_post_fix() const;
146 struct parse_tree_symbol
148 std::string name;
149 symbol_prefix::type type;
151 parse_tree_symbol();
154 struct parse_tree_unary_operator_node
156 unary_operator_type::type type;
157 parse_tree_node argument;
160 struct parse_tree_binary_operator_node
162 binary_operator_type::type type;
163 parse_tree_node
164 left_argument,
165 right_argument;
168 struct parse_tree_call
170 parse_tree_node function;
171 parse_tree_nodes arguments;
174 struct parse_tree_array
176 parse_tree_nodes elements;
179 struct if_statement
181 parse_tree_node conditional_term;
182 executable_units body;
185 struct if_else_statement
187 parse_tree_node conditional_term;
188 executable_units
189 if_body,
190 else_body;
193 struct for_each_statement
195 parse_tree_node container;
196 executable_units body;
199 struct for_statement
201 parse_tree_node
202 initialisation,
203 conditional,
204 iteration;
205 executable_units body;
208 struct while_statement
210 parse_tree_node conditional_term;
211 executable_units body;
214 struct executable_unit
216 executable_unit_type::type type;
218 union
220 parse_tree_node * statement_pointer;
221 if_statement * if_pointer;
222 if_else_statement * if_else_pointer;
223 for_each_statement * for_each_pointer;
224 for_statement * for_pointer;
225 while_statement * while_pointer;
229 struct function
231 string_vector arguments;
232 executable_units body;