From 4dbf1ee2bd645b8e6170f608e60ffaa714f29a71 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sat, 23 Apr 2016 22:12:08 -0600 Subject: [PATCH] Pull out Return_Optimizer --- .../chaiscript/language/chaiscript_engine.hpp | 4 +- .../language/chaiscript_optimizer.hpp | 39 ++++++++++++++++++- .../chaiscript/language/chaiscript_parser.hpp | 31 +-------------- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index d4fce2d..2716127 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -219,7 +219,7 @@ namespace chaiscript std::vector t_modulepaths = std::vector(), std::vector t_usepaths = std::vector()) : m_module_paths(std::move(t_modulepaths)), m_use_paths(std::move(t_usepaths)), - m_parser(std::make_unique>()) + m_parser(std::make_unique>>()) { if (m_module_paths.empty()) { @@ -244,7 +244,7 @@ namespace chaiscript ChaiScript( std::vector t_modulepaths = std::vector(), std::vector t_usepaths = std::vector()) : m_module_paths(std::move(t_modulepaths)), m_use_paths(std::move(t_usepaths)), - m_parser(std::make_unique>()) + m_parser(std::make_unique>>()) { if (m_module_paths.empty()) { diff --git a/include/chaiscript/language/chaiscript_optimizer.hpp b/include/chaiscript/language/chaiscript_optimizer.hpp index 8d1173b..8fc10d8 100644 --- a/include/chaiscript/language/chaiscript_optimizer.hpp +++ b/include/chaiscript/language/chaiscript_optimizer.hpp @@ -13,6 +13,20 @@ namespace chaiscript { namespace optimizer { + template + struct Optimizer : T... + { + Optimizer() = default; + Optimizer(T ... t) + : T(std::move(t))... + { + } + + AST_NodePtr optimize(AST_NodePtr p) { + (void)std::initializer_list{ (p = T::optimize(p), 0)... }; + return p; + } + }; template auto child_at(const T &node, const size_t offset) { @@ -35,9 +49,32 @@ namespace chaiscript { template AST_NodePtr make_compiled_node(const AST_NodePtr &original_node, std::vector children, T callable) { - return chaiscript::make_shared(original_node, children, std::move(callable)); + return chaiscript::make_shared(original_node, std::move(children), std::move(callable)); } + + struct Return_Optimizer { + AST_NodePtr optimize(const AST_NodePtr &p) + { + if (p->identifier == AST_Node_Type::Def + && !p->children.empty()) + { + auto &last_child = p->children.back(); + if (last_child->identifier == AST_Node_Type::Block) { + auto &block_last_child = last_child->children.back(); + if (block_last_child->identifier == AST_Node_Type::Return) { + if (block_last_child->children.size() == 1) { + last_child->children.back() = block_last_child->children[0]; + } + } + } + } + + return p; + } + }; + + struct For_Loop_Optimizer { AST_NodePtr optimize(const AST_NodePtr &for_node) { diff --git a/include/chaiscript/language/chaiscript_parser.hpp b/include/chaiscript/language/chaiscript_parser.hpp index e41bd7e..0b5af4b 100644 --- a/include/chaiscript/language/chaiscript_parser.hpp +++ b/include/chaiscript/language/chaiscript_parser.hpp @@ -318,35 +318,6 @@ namespace chaiscript } } - /// Returns the front-most AST node - - - static void optimize_returns(AST_NodePtr &p) - { - for (auto &c : p->children) - { - if (c->identifier == AST_Node_Type::Def && c->children.size() > 0) { - auto &last_child = c->children.back(); - if (last_child->identifier == AST_Node_Type::Block) { - auto &block_last_child = last_child->children.back(); - if (block_last_child->identifier == AST_Node_Type::Return) { - if (block_last_child->children.size() == 1) { - block_last_child = block_last_child->children[0]; - } - } - } - } - optimize_returns(c); - } - } - - - AST_NodePtr ast(bool t_optimize_returns = true) { - auto ptr = m_match_stack.front(); - if (t_optimize_returns) { optimize_returns(ptr); } - return ptr; - } - /// Helper function that collects ast_nodes from a starting position to the top of the stack into a new AST node template @@ -2383,7 +2354,7 @@ namespace chaiscript m_match_stack.push_back(chaiscript::make_shared()); } - return ast(); + return m_match_stack.front(); } }; }