3 #include <fridh/symbol.hpp>
4 #include <ail/string.hpp>
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 parse_tree_node::parse_tree_node(parse_tree_node
const & other
)
19 parse_tree_node::~parse_tree_node()
24 parse_tree_node
& parse_tree_node::operator=(parse_tree_node
const & other
)
31 void parse_tree_node::copy(parse_tree_node
const & other
)
33 std::cout
<< "parse_tree_node copy " << (void *)this << " from " << (void *)&other
<< std::endl
;
35 //std::cout << (int)other.type << std::endl;
37 //std::cout << "Copying " << other.to_string() << std::endl;
39 #define COPY_MEMBER(type, member_type, member) \
40 case parse_tree_node_type::type: \
41 member = new member_type(*other.member); \
48 COPY_MEMBER(variable
, variable
, variable_pointer
)
49 COPY_MEMBER(symbol
, parse_tree_symbol
, symbol_pointer
)
50 COPY_MEMBER(unary_operator_node
, parse_tree_unary_operator_node
, unary_operator_pointer
)
51 COPY_MEMBER(binary_operator_node
, parse_tree_binary_operator_node
, binary_operator_pointer
)
52 COPY_MEMBER(call
, parse_tree_call
, call_pointer
)
53 COPY_MEMBER(array
, parse_tree_array
, array_pointer
)
58 //std::cout << "Result: " << to_string() << std::endl;
61 void parse_tree_node::destroy()
63 std::cout
<< "parse_tree_node destroy " << (void *)this << std::endl
;
65 #define DELETE_MEMBER(type, member) \
66 case parse_tree_node_type::type: \
72 DELETE_MEMBER(variable
, variable_pointer
)
73 DELETE_MEMBER(symbol
, symbol_pointer
)
74 DELETE_MEMBER(unary_operator_node
, unary_operator_pointer
)
75 DELETE_MEMBER(binary_operator_node
, binary_operator_pointer
)
76 DELETE_MEMBER(call
, call_pointer
)
77 DELETE_MEMBER(array
, array_pointer
)
80 type
= parse_tree_node_type::uninitialised
;
86 parse_tree_node::parse_tree_node(parse_tree_node_type::type type
):
91 parse_tree_node::parse_tree_node(variable
* variable_pointer
):
92 type(parse_tree_node_type::variable
),
93 variable_pointer(variable_pointer
)
97 parse_tree_node::parse_tree_node(unary_operator_type::type unary_operator
):
98 type(parse_tree_node_type::unary_operator_node
)
100 unary_operator_pointer
= new parse_tree_unary_operator_node
;
101 unary_operator_pointer
->type
= unary_operator
;
104 parse_tree_node::parse_tree_node(binary_operator_type::type binary_operator
):
105 type(parse_tree_node_type::binary_operator_node
)
107 binary_operator_pointer
= new parse_tree_binary_operator_node
;
108 binary_operator_pointer
->type
= binary_operator
;
111 parse_tree_node::parse_tree_node(parse_tree_nodes
& elements
):
112 type(parse_tree_node_type::array
)
114 array_pointer
= new parse_tree_array
;
115 array_pointer
->elements
= elements
;
118 void parse_tree_node::is_call()
120 type
= parse_tree_node_type::call
;
121 call_pointer
= new parse_tree_call
;
124 bool parse_tree_node::is_post_fix() const
126 if(type
!= parse_tree_node_type::unary_operator_node
)
127 throw ail::exception("Tried to retrieve post fix node properties of a non-post-fix node");
129 unary_operator_type::type unary_type
= unary_operator_pointer
->type
;
131 unary_type
== unary_operator_type::increment
||
132 unary_type
== unary_operator_type::decrement
136 std::string
parse_tree_node::to_string() const
140 case parse_tree_node_type::uninitialised
:
141 return "uninitialised";
143 case parse_tree_node_type::variable
:
146 case parse_tree_node_type::symbol
:
147 return "symbol: " + symbol_pointer
->name
+ " (" + ail::hex_string_32((ulong
)symbol_pointer
) + ")";
149 case parse_tree_node_type::unary_operator_node
:
150 return "unary operator (" + unary_operator_pointer
->argument
.to_string() + ")";
152 case parse_tree_node_type::binary_operator_node
:
153 return "binary operator (" + binary_operator_pointer
->left_argument
.to_string() + ", " + binary_operator_pointer
->right_argument
.to_string() + ")";
155 case parse_tree_node_type::call
:
158 case parse_tree_node_type::array
:
161 case parse_tree_node_type::call_operator
:
162 return "call operator";
164 case parse_tree_node_type::spaced_call_operator
:
165 return "spaced call operator";
167 case parse_tree_node_type::iterator
:
171 return "unknown (" + ail::number_to_string(static_cast<int>(type
)) + ")";