#include <textual/parser_bits.h>
#include <textual/string_manipulation.h>
-#define DEBUG_SYMBOL_TREE
+//#define DEBUG_SYMBOL_TREE
// uncomment for totally noisy version.
#include <loggers/program_wide_logger.h>
symbol_tree_associations(int estimated_elements)
: symbol_table<symbol_tree *>(estimated_elements) {}
virtual ~symbol_tree_associations() {
-
-//hmmm: below was really wrong and things are still wrong because we're letting the symtab destruct our trees?
-// real thing would be to just toss any pointers referenced in the sym tab here.
-// OR... not at all because sym tab stores objects, and expects objects, and since a pointer isn't an object it will not auto-delete?
-
-
-//hmmm: why was this here? was it ever needed?
-//hmmm: maybe it's the missing link?
-
//probably we don't actually want to whack here???
// for (int i = 0; i < symbols(); i++) {
// WHACK(use(i));
_associations(new symbol_tree_associations(estimated_elements)),
_name(new astring(node_name))
{
+ FUNCDEF("constructor")
}
symbol_tree::~symbol_tree()
{
FUNCDEF("destructor");
-LOG("symtree dtor: prior to whacks");
+#ifdef DEBUG_SYMBOL_TREE
+ LOG("symtree dtor: prior to whacks");
+#endif
WHACK(_associations);
-LOG("symtree dtor: after whacking associations");
+#ifdef DEBUG_SYMBOL_TREE
+ LOG("symtree dtor: after whacking associations");
+#endif
WHACK(_name);
-LOG("symtree dtor: after all whacks");
+#ifdef DEBUG_SYMBOL_TREE
+ LOG("symtree dtor: after all whacks");
+#endif
}
int symbol_tree::children() const { return _associations->symbols(); }
FUNCDEF("prune");
#endif
symbol_tree *to_zap = dynamic_cast<symbol_tree *>(to_zap_in);
- if (!to_zap) {
+ if (to_zap) {
#ifdef DEBUG_SYMBOL_TREE
- LOG("about to barf due to null symtree after dynamic cast.");
+ LOG(astring("zapping node for ") + to_zap->name());
#endif
- throw("error: symbol_tree::prune: wrong type of node in prune");
- }
+ int found = which(to_zap); // find the node in the tree.
+ if (negative(found)) return common::NOT_FOUND; // not found.
+#ifdef DEBUG_SYMBOL_TREE
+ int kids = _associations->symbols();
+#endif
+ _associations->whack(to_zap->name()); // remove from associations.
#ifdef DEBUG_SYMBOL_TREE
- LOG(astring("zapping node for ") + to_zap->name());
+ if (kids - 1 != _associations->symbols())
+ throw("error: symbol_tree::prune: failed to crop kid in symtab");
#endif
- int found = which(to_zap); // find the node in the tree.
- if (negative(found)) return common::NOT_FOUND; // not found.
+ } else {
#ifdef DEBUG_SYMBOL_TREE
- int kids = _associations->symbols();
+ LOG("skip symtree prune steps due to null symtree after dynamic cast.");
#endif
- _associations->whack(to_zap->name()); // remove from associations.
+///hmmm: how about not? throw("error: symbol_tree::prune: wrong type of node in prune");
+ }
#ifdef DEBUG_SYMBOL_TREE
- if (kids - 1 != _associations->symbols())
- throw("error: symbol_tree::prune: failed to crop kid in symtab");
+ LOG("about to call base tree::prune...");
#endif
tree::prune(to_zap); // remove from tree.
+#ifdef DEBUG_SYMBOL_TREE
+ LOG("after called base tree::prune.");
+#endif
return common::OKAY;
}