Implemented the construction pattern for parse tree nodes and executable units
[fridhskrift.git] / interpreter / function.cpp
blob4f8804732ee2012b0715b7fe2fad6247aaebc31e
1 #include <iostream>
2 #include <map>
3 #include <fridh/symbol.hpp>
4 #include <ail/string.hpp>
6 namespace fridh
8 parse_tree_node::parse_tree_node():
9 type(parse_tree_node_type::uninitialised)
11 std::cout << "parse_tree_node " << (void *)this << std::endl;
14 void parse_tree_node::copy(construction_pattern const & other_pattern)
16 parse_tree_node const & other = dynamic_cast<parse_tree_node const &>(other_pattern);
18 std::cout << "parse_tree_node copy " << (void *)this << " from " << (void *)&other << std::endl;
20 //std::cout << (int)other.type << std::endl;
22 //std::cout << "Copying " << other.to_string() << std::endl;
24 #define COPY_MEMBER(type, member_type, member) \
25 case parse_tree_node_type::type: \
26 member = new member_type(*other.member); \
27 break;
29 type = other.type;
31 switch(other.type)
33 COPY_MEMBER(variable, variable, variable_pointer)
34 COPY_MEMBER(symbol, parse_tree_symbol, symbol_pointer)
35 COPY_MEMBER(unary_operator_node, parse_tree_unary_operator_node, unary_operator_pointer)
36 COPY_MEMBER(binary_operator_node, parse_tree_binary_operator_node, binary_operator_pointer)
37 COPY_MEMBER(call, parse_tree_call, call_pointer)
38 COPY_MEMBER(array, parse_tree_array, array_pointer)
41 #undef COPY_MEMBER
43 //std::cout << "Result: " << to_string() << std::endl;
46 void parse_tree_node::destroy()
48 std::cout << "parse_tree_node destroy " << (void *)this << std::endl;
50 #define DELETE_MEMBER(type, member) \
51 case parse_tree_node_type::type: \
52 delete member; \
53 break;
55 switch(type)
57 DELETE_MEMBER(variable, variable_pointer)
58 DELETE_MEMBER(symbol, symbol_pointer)
59 DELETE_MEMBER(unary_operator_node, unary_operator_pointer)
60 DELETE_MEMBER(binary_operator_node, binary_operator_pointer)
61 DELETE_MEMBER(call, call_pointer)
62 DELETE_MEMBER(array, array_pointer)
65 type = parse_tree_node_type::uninitialised;
67 #undef DELETE_MEMBER
71 parse_tree_node::parse_tree_node(parse_tree_node_type::type type):
72 type(type)
76 parse_tree_node::parse_tree_node(variable * variable_pointer):
77 type(parse_tree_node_type::variable),
78 variable_pointer(variable_pointer)
82 parse_tree_node::parse_tree_node(unary_operator_type::type unary_operator):
83 type(parse_tree_node_type::unary_operator_node)
85 unary_operator_pointer = new parse_tree_unary_operator_node;
86 unary_operator_pointer->type = unary_operator;
89 parse_tree_node::parse_tree_node(binary_operator_type::type binary_operator):
90 type(parse_tree_node_type::binary_operator_node)
92 binary_operator_pointer = new parse_tree_binary_operator_node;
93 binary_operator_pointer->type = binary_operator;
96 parse_tree_node::parse_tree_node(parse_tree_nodes & elements):
97 type(parse_tree_node_type::array)
99 array_pointer = new parse_tree_array;
100 array_pointer->elements = elements;
103 void parse_tree_node::is_call()
105 type = parse_tree_node_type::call;
106 call_pointer = new parse_tree_call;
109 bool parse_tree_node::is_post_fix() const
111 if(type != parse_tree_node_type::unary_operator_node)
112 throw ail::exception("Tried to retrieve post fix node properties of a non-post-fix node");
114 unary_operator_type::type unary_type = unary_operator_pointer->type;
115 return
116 unary_type == unary_operator_type::increment ||
117 unary_type == unary_operator_type::decrement
121 std::string parse_tree_node::to_string() const
123 switch(type)
125 case parse_tree_node_type::uninitialised:
126 return "uninitialised";
128 case parse_tree_node_type::variable:
129 return "variable";
131 case parse_tree_node_type::symbol:
132 return "symbol: " + symbol_pointer->name + " (" + ail::hex_string_32((ulong)symbol_pointer) + ")";
134 case parse_tree_node_type::unary_operator_node:
135 return "unary operator (" + unary_operator_pointer->argument.to_string() + ")";
137 case parse_tree_node_type::binary_operator_node:
138 return "binary operator (" + binary_operator_pointer->left_argument.to_string() + ", " + binary_operator_pointer->right_argument.to_string() + ")";
140 case parse_tree_node_type::call:
141 return "call";
143 case parse_tree_node_type::array:
144 return "array";
146 case parse_tree_node_type::call_operator:
147 return "call operator";
149 case parse_tree_node_type::spaced_call_operator:
150 return "spaced call operator";
152 case parse_tree_node_type::iterator:
153 return "iterator";
155 default:
156 return "unknown (" + ail::number_to_string(static_cast<int>(type)) + ")";
160 parse_tree_symbol::parse_tree_symbol():
161 type(symbol_prefix::none)
163 std::cout << "parse_tree_symbol " << (void *)this << std::endl;
166 parse_tree_symbol::parse_tree_symbol(parse_tree_symbol const & other):
167 name(other.name),
168 type(other.type)
170 std::cout << "parse_tree_symbol " << (void *)this << " from " << (void *)&other << std::endl;
173 parse_tree_symbol::~parse_tree_symbol()
175 std::cout << "~parse_tree_symbol " << (void *)this << std::endl;