Pull out Return_Optimizer
This commit is contained in:
parent
4324a700ad
commit
4dbf1ee2bd
@ -219,7 +219,7 @@ namespace chaiscript
|
|||||||
std::vector<std::string> t_modulepaths = std::vector<std::string>(),
|
std::vector<std::string> t_modulepaths = std::vector<std::string>(),
|
||||||
std::vector<std::string> t_usepaths = std::vector<std::string>())
|
std::vector<std::string> t_usepaths = std::vector<std::string>())
|
||||||
: m_module_paths(std::move(t_modulepaths)), m_use_paths(std::move(t_usepaths)),
|
: m_module_paths(std::move(t_modulepaths)), m_use_paths(std::move(t_usepaths)),
|
||||||
m_parser(std::make_unique<parser::ChaiScript_Parser<optimizer::For_Loop_Optimizer>>())
|
m_parser(std::make_unique<parser::ChaiScript_Parser<optimizer::Optimizer<optimizer::Return_Optimizer, optimizer::For_Loop_Optimizer>>>())
|
||||||
{
|
{
|
||||||
if (m_module_paths.empty())
|
if (m_module_paths.empty())
|
||||||
{
|
{
|
||||||
@ -244,7 +244,7 @@ namespace chaiscript
|
|||||||
ChaiScript( std::vector<std::string> t_modulepaths = std::vector<std::string>(),
|
ChaiScript( std::vector<std::string> t_modulepaths = std::vector<std::string>(),
|
||||||
std::vector<std::string> t_usepaths = std::vector<std::string>())
|
std::vector<std::string> t_usepaths = std::vector<std::string>())
|
||||||
: m_module_paths(std::move(t_modulepaths)), m_use_paths(std::move(t_usepaths)),
|
: m_module_paths(std::move(t_modulepaths)), m_use_paths(std::move(t_usepaths)),
|
||||||
m_parser(std::make_unique<parser::ChaiScript_Parser<optimizer::For_Loop_Optimizer>>())
|
m_parser(std::make_unique<parser::ChaiScript_Parser<optimizer::Optimizer<optimizer::Return_Optimizer, optimizer::For_Loop_Optimizer>>>())
|
||||||
{
|
{
|
||||||
if (m_module_paths.empty())
|
if (m_module_paths.empty())
|
||||||
{
|
{
|
||||||
|
@ -13,6 +13,20 @@
|
|||||||
namespace chaiscript {
|
namespace chaiscript {
|
||||||
namespace optimizer {
|
namespace optimizer {
|
||||||
|
|
||||||
|
template<typename ... T>
|
||||||
|
struct Optimizer : T...
|
||||||
|
{
|
||||||
|
Optimizer() = default;
|
||||||
|
Optimizer(T ... t)
|
||||||
|
: T(std::move(t))...
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
AST_NodePtr optimize(AST_NodePtr p) {
|
||||||
|
(void)std::initializer_list<int>{ (p = T::optimize(p), 0)... };
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
auto child_at(const T &node, const size_t offset) {
|
auto child_at(const T &node, const size_t offset) {
|
||||||
@ -35,9 +49,32 @@ namespace chaiscript {
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
AST_NodePtr make_compiled_node(const AST_NodePtr &original_node, std::vector<AST_NodePtr> children, T callable)
|
AST_NodePtr make_compiled_node(const AST_NodePtr &original_node, std::vector<AST_NodePtr> children, T callable)
|
||||||
{
|
{
|
||||||
return chaiscript::make_shared<AST_Node, eval::Compiled_AST_Node>(original_node, children, std::move(callable));
|
return chaiscript::make_shared<AST_Node, eval::Compiled_AST_Node>(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 {
|
struct For_Loop_Optimizer {
|
||||||
AST_NodePtr optimize(const AST_NodePtr &for_node) {
|
AST_NodePtr optimize(const AST_NodePtr &for_node) {
|
||||||
|
|
||||||
|
@ -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
|
/// Helper function that collects ast_nodes from a starting position to the top of the stack into a new AST node
|
||||||
template<typename NodeType>
|
template<typename NodeType>
|
||||||
@ -2383,7 +2354,7 @@ namespace chaiscript
|
|||||||
m_match_stack.push_back(chaiscript::make_shared<AST_Node, eval::Noop_AST_Node>());
|
m_match_stack.push_back(chaiscript::make_shared<AST_Node, eval::Noop_AST_Node>());
|
||||||
}
|
}
|
||||||
|
|
||||||
return ast();
|
return m_match_stack.front();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user