diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index ba36c7a..6ef776b 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -737,6 +737,7 @@ namespace chaiscript } else { if (children.size() > 2) { size_t i = 2; + /// \todo these string comparisons are clunky while (i < children.size()) { if (children[i]->text == "else") { return children[i+1]->eval(t_ss); diff --git a/include/chaiscript/language/chaiscript_parser.hpp b/include/chaiscript/language/chaiscript_parser.hpp index 4980014..d1d8084 100644 --- a/include/chaiscript/language/chaiscript_parser.hpp +++ b/include/chaiscript/language/chaiscript_parser.hpp @@ -2252,7 +2252,37 @@ namespace chaiscript case(AST_Node_Type::Bitwise_Xor) : case(AST_Node_Type::Bitwise_Or) : case(AST_Node_Type::Comparison) : - build_match(prev_stack_top, oper); + { + bool folded = false; + const auto size = m_match_stack.size(); + + try { + if (m_match_stack[size - 1]->identifier == AST_Node_Type::Constant + && m_match_stack[size - 2]->identifier == AST_Node_Type::Constant) { + const auto parsed = Operators::to_operator(oper); + if (parsed != Operators::Opers::invalid) { + const auto lhs = std::dynamic_pointer_cast(m_match_stack[size-2])->m_value; + const auto rhs = std::dynamic_pointer_cast(m_match_stack[size-1])->m_value; + if (lhs.get_type_info().is_arithmetic() && rhs.get_type_info().is_arithmetic()) { + const auto val = Boxed_Number::do_oper(parsed, lhs, rhs); + const auto start = m_match_stack[size-2]->location; + const auto match = m_match_stack[size-2]->text + " " + oper + " " + m_match_stack[size-1]->text; + m_match_stack.resize(size-2); + m_match_stack.push_back( + make_node(std::move(match), start.start.line, start.start.column, std::move(val))); + folded = true; + } + } + } + } catch (const std::exception &) { + //failure to fold + } + + if (!folded) { + build_match(prev_stack_top, oper); + } + } + break; case(AST_Node_Type::Logical_And) :