Simplified the arithmetic operator code
[fridhskrift.git] / fridh / function.hpp
blobd68d476b012aa5f98380197b0a034fd8f1911786
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 assignment,
16 crement,
17 return_statement,
18 if_statement,
19 if_else_statement,
20 for_each_statement,
21 for_statement,
22 while_statement,
26 namespace assignment_type
28 enum type
30 assignment,
31 addition,
32 subtraction,
33 multiplication,
34 division,
35 modulo,
36 exponentiation,
40 namespace crement_type
42 enum type
44 decrement,
45 increment,
49 namespace unary_operator_type
51 enum type
53 negation,
54 logical_not,
55 binary_not,
59 namespace binary_operator_type
61 enum type
63 addition,
64 subtraction,
65 multiplication,
66 division,
67 modulo,
68 exponentiation,
70 less_than,
71 less_than_or_equal,
72 greater_than,
73 greater_than_or_equal,
74 unequal,
75 equal,
77 logical_and,
78 logical_or,
80 shift_left,
81 shift_right,
83 binary_and,
84 binary_or,
85 binary_xor,
87 selection,
91 namespace parse_tree_node_type
93 enum type
95 uninitialised,
97 variable,
98 symbol,
99 unary_operator_node,
100 binary_operator_node,
101 call,
102 array,
104 call_operator,
105 spaced_call_operator,
107 iterator,
111 namespace symbol_prefix
113 enum type
115 none,
116 scope_operator,
117 class_operator,
121 struct
122 parse_tree_node,
123 parse_tree_symbol,
124 executable_units;
126 typedef std::vector<parse_tree_node> parse_tree_nodes;
127 typedef std::vector<parse_tree_symbol> parse_tree_symbols;
128 typedef std::vector<executable_unit> executable_units;
130 struct parse_tree_symbol
132 std::string name;
133 symbol_prefix::type type;
135 parse_tree_symbol();
138 struct parse_tree_unary_operator_node
140 unary_operator_type type;
141 parse_tree_node argument;
144 struct parse_tree_binary_operator_node
146 binary_operator_type type;
147 parse_tree_node
148 left_argument,
149 right_argument;
152 struct parse_tree_call
154 parse_tree_node function;
155 parse_tree_nodes arguments;
158 struct parse_tree_array
160 parse_tree_nodes elements;
163 struct parse_tree_node
165 parse_tree_node_type::type type;
166 union
168 variable * variable_pointer;
169 parse_tree_symbol * symbol_pointer;
170 parse_tree_unary_operator_node * unary_operator_pointer;
171 parse_tree_binary_operator_node * binary_operator_pointer;
172 parse_tree_call * call_pointer;
173 parse_tree_array * array_pointer;
176 parse_tree_node();
177 parse_tree_node(parse_tree_node_type::type type);
178 parse_tree_node(variable * variable_pointer);
179 parse_tree_node(unary_operator_type::type unary_operator);
180 parse_tree_node(binary_operator_type::type binary_operator);
181 parse_tree_node(parse_tree_nodes & elements);
183 void is_call();
186 struct assignment_statement
188 assignment_type::type type;
189 parse_tree_symbols symbols;
190 parse_tree_node term;
193 struct crement_statement
195 parse_tree_symbol symbol;
196 crement_type::type type;
199 struct if_statement
201 parse_tree_node conditional_term;
202 executable_units body;
205 struct if_else_statement
207 parse_tree_node conditional_term;
208 executable_units
209 if_body,
210 else_body;
213 struct for_each_statement
215 parse_tree_symbol container;
216 executable_units body;
219 struct for_statement
221 parse_tree_node
222 initialisation,
223 conditional,
224 iteration;
225 executable_units body;
228 struct while_statement
230 parse_tree_node conditional_term;
231 executable_units body;
234 struct executable_unit
236 executable_unit_type::type type;
238 union
240 parse_tree_node * statement_pointer;
241 assignment_stamtent * assignment_pointer;
242 crement_statement * crement_pointer;
243 if_statement * if_pointer;
244 if_else_statement * if_else_pointer;
245 for_each_statement * for_each_pointer;
246 for_statement * for_pointer;
247 while_statement * while_pointer;
251 struct function
253 string_vector arguments;
254 executable_units body;
257 bool convert_lexeme_to_assignment_type(lexeme_type::type input, assignment_type::type & output);
258 bool convert_lexeme_to_crement_type(lexeme_type::type input, crement_type::type & output);
259 bool is_assignment_lexeme(lexeme_type::type input);