From 87eda27df80e0c3b6e33fef75906fd67d89b11d7 Mon Sep 17 00:00:00 2001 From: binrapt Date: Sat, 17 Oct 2009 04:44:35 +0200 Subject: [PATCH] It appears that something is destroyed when operator_resolution returns, hilarity ensues --- fridh/function.hpp | 2 ++ interpreter/function.cpp | 25 ++++++++++++++++++++++--- parser/node.cpp | 6 +++++- parser/operator.cpp | 15 +++++++++++---- parser/statement.cpp | 24 +++++++++++++++++------- 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/fridh/function.hpp b/fridh/function.hpp index 7994f6b..241fab2 100644 --- a/fridh/function.hpp +++ b/fridh/function.hpp @@ -154,6 +154,8 @@ namespace fridh symbol_prefix::type type; parse_tree_symbol(); + parse_tree_symbol(parse_tree_symbol const & other); + ~parse_tree_symbol(); }; struct parse_tree_unary_operator_node diff --git a/interpreter/function.cpp b/interpreter/function.cpp index 8d7c362..3abdac4 100644 --- a/interpreter/function.cpp +++ b/interpreter/function.cpp @@ -8,10 +8,14 @@ namespace fridh parse_tree_node::parse_tree_node(): type(parse_tree_node_type::uninitialised) { + std::cout << "parse_tree_node " << (void *)this << std::endl; } parse_tree_node::parse_tree_node(parse_tree_node const & other) { + std::cout << "parse_tree_node " << (void *)this << " from " << (void *)&other << std::endl; + + //std::cout << (int)other.type << std::endl; //std::cout << "Copying " << other.to_string() << std::endl; @@ -41,6 +45,8 @@ namespace fridh parse_tree_node::~parse_tree_node() { + std::cout << "~parse_tree_node " << (void *)this << std::endl; + #define DELETE_MEMBER(type, member) \ case parse_tree_node_type::type: \ delete member; \ @@ -121,13 +127,13 @@ namespace fridh return "variable"; case parse_tree_node_type::symbol: - return "symbol: " + symbol_pointer->name; + return "symbol: " + symbol_pointer->name + " (" + ail::hex_string_32((ulong)symbol_pointer) + ")"; case parse_tree_node_type::unary_operator_node: - return "unary operator"; + return "unary operator (" + unary_operator_pointer->argument.to_string() + ")"; case parse_tree_node_type::binary_operator_node: - return "binary operator"; + return "binary operator (" + binary_operator_pointer->left_argument.to_string() + ", " + binary_operator_pointer->right_argument.to_string() + ")"; case parse_tree_node_type::call: return "call"; @@ -152,5 +158,18 @@ namespace fridh parse_tree_symbol::parse_tree_symbol(): type(symbol_prefix::none) { + std::cout << "parse_tree_symbol " << (void *)this << std::endl; + } + + parse_tree_symbol::parse_tree_symbol(parse_tree_symbol const & other): + name(other.name), + type(other.type) + { + std::cout << "parse_tree_symbol " << (void *)this << " from " << (void *)&other << std::endl; + } + + parse_tree_symbol::~parse_tree_symbol() + { + std::cout << "~parse_tree_symbol " << (void *)this << std::endl; } } diff --git a/parser/node.cpp b/parser/node.cpp index a05845e..cc35f07 100644 --- a/parser/node.cpp +++ b/parser/node.cpp @@ -73,6 +73,11 @@ namespace fridh parse_tree_symbol * & symbol_pointer = output.symbol_pointer; symbol_pointer = new parse_tree_symbol; symbol_pointer->name = *input.string; + + /* + std::cout << "lexeme_to_argument_node " << (int)output.type << std::endl; + std::cout << output.to_string() << std::endl; + */ } else { @@ -111,7 +116,6 @@ namespace fridh } output.type = parse_tree_node_type::variable; - output.variable_pointer = new_variable; } } diff --git a/parser/operator.cpp b/parser/operator.cpp index a1f34a4..81b97cc 100644 --- a/parser/operator.cpp +++ b/parser/operator.cpp @@ -10,8 +10,10 @@ namespace fridh if(extremum_offset != 1) throw ail::exception("Invalid call offset encountered during operator resolution"); } + void parser::operator_resolution(parse_tree_nodes & input, parse_tree_node & output) { + std::cout << "operator_resolution on " << input.size() << std::endl; if(input.size() == 1) { output = input[0]; @@ -27,8 +29,6 @@ namespace fridh parse_tree_node & current_node = input[i]; word precedence; - std::cout << (int)current_node.type << " "; - if ( current_node.type == parse_tree_node_type::unary_operator_node && @@ -59,8 +59,6 @@ namespace fridh } } - std::cout << std::endl; - if(!got_an_operator) error("Failed to perform operator resolution"); @@ -90,10 +88,19 @@ namespace fridh left_side(input.begin(), input.begin() + extremum_offset), right_side(input.begin() + next_offset, input.end()); + std::cout << "parse_tree_node_type::binary_operator_node:" << std::endl; + + std::cout << operator_node.to_string() << std::endl; + operator_resolution(left_side, binary_operator_node.left_argument); operator_resolution(right_side, binary_operator_node.right_argument); + std::cout << operator_node.to_string() << std::endl; + output = operator_node; + + std::cout << "operator_resolution returns: " << output.to_string() << std::endl; + return; } diff --git a/parser/statement.cpp b/parser/statement.cpp index f53787d..d2c0138 100644 --- a/parser/statement.cpp +++ b/parser/statement.cpp @@ -23,13 +23,6 @@ namespace fridh add_unary_node(lexeme(lexeme_type::negation), arguments); } - void parser::process_node_group(parse_tree_nodes & arguments, parse_tree_nodes & output) - { - parse_tree_node new_node; - operator_resolution(arguments, new_node); - output.push_back(new_node); - } - void visualise_nodes(parse_tree_nodes & nodes) { std::cout << "Parse tree nodes:" << std::endl; @@ -38,6 +31,20 @@ namespace fridh std::cout << counter << ". " << i->to_string() << std::endl; } + void parser::process_node_group(parse_tree_nodes & arguments, parse_tree_nodes & output) + { + std::cout << "process_node_group" << std::endl; + visualise_nodes(arguments); + parse_tree_node new_node; + std::cout << "new_node:" << std::endl; + std::cout << new_node.to_string() << std::endl; + operator_resolution(arguments, new_node); + std::cout << "operator_resolution returned:" << std::endl; + std::cout << new_node.to_string() << std::endl; + output.push_back(new_node); + std::cout << "/process_node_group" << std::endl; + } + void parser::process_atomic_statement(lexeme_container & lexemes, std::size_t & offset, parse_tree_nodes & output, bool allow_multi_statements, lexeme_type::type terminator) { bool got_last_group = false; @@ -223,6 +230,9 @@ namespace fridh if(last_group != lexeme_group::argument) error("An operator is missing an argument"); + std::cout << "Bottom" << std::endl; + visualise_nodes(arguments); + process_node_group(arguments, output); } } -- 2.11.4.GIT