From 5aa0bfcea4d4e864da42adeb00b108d4d5aaa309 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Tue, 11 Aug 2015 19:20:18 -0600 Subject: [PATCH 1/3] Add some convenience functions for parsing --- include/chaiscript/dispatchkit/bootstrap.hpp | 15 ++++---- .../chaiscript/language/chaiscript_engine.hpp | 34 ++++++++++++++----- unittests/parser_test.chai | 10 ++++++ 3 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 unittests/parser_test.chai diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index 0f57528..25f9f43 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -562,13 +562,14 @@ namespace chaiscript "eval_error", { }, { {fun(&chaiscript::exception::eval_error::reason), "reason"}, - {fun(std::function (const chaiscript::exception::eval_error &t_eval_error)>([](const chaiscript::exception::eval_error &t_eval_error) -> std::vector { - std::vector retval; - std::transform(t_eval_error.call_stack.begin(), t_eval_error.call_stack.end(), - std::back_inserter(retval), - &chaiscript::var>); - return retval; - })), "call_stack"} } + {fun(&chaiscript::exception::eval_error::pretty_print), "pretty_print"}, + {fun(std::function (const chaiscript::exception::eval_error &t_eval_error)>([](const chaiscript::exception::eval_error &t_eval_error) -> std::vector { + std::vector retval; + std::transform(t_eval_error.call_stack.begin(), t_eval_error.call_stack.end(), + std::back_inserter(retval), + &chaiscript::var>); + return retval; + })), "call_stack"} } ); diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index a6a604a..7080277 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -284,14 +284,7 @@ namespace chaiscript - const Boxed_Value internal_eval_ast(const AST_NodePtr &t_ast) - { - try { - return t_ast->eval(m_engine); - } catch (const exception::eval_error &t_ee) { - throw Boxed_Value(t_ee); - } - } + /// Evaluates the given file and looks in the 'use' paths const Boxed_Value internal_eval_file(const std::string &t_filename) { @@ -396,7 +389,8 @@ namespace chaiscript m_engine.add(fun([this](const std::string &t_file){ return use(t_file); }), "use"); m_engine.add(fun([this](const std::string &t_file){ return internal_eval_file(t_file); }), "eval_file"); m_engine.add(fun([this](const std::string &t_str){ return internal_eval(t_str); }), "eval"); - m_engine.add(fun([this](const AST_NodePtr &t_ast){ return internal_eval_ast(t_ast); }), "eval"); + m_engine.add(fun([this](const AST_NodePtr &t_ast){ return eval(t_ast); }), "eval"); + m_engine.add(fun(&parse), "parse"); m_engine.add(fun(&ChaiScript::version_major), "version_major"); m_engine.add(fun(&ChaiScript::version_minor), "version_minor"); @@ -517,6 +511,28 @@ namespace chaiscript build_eval_system(ModulePtr()); } + + const Boxed_Value eval(const AST_NodePtr &t_ast) + { + try { + return t_ast->eval(m_engine); + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } + } + + static AST_NodePtr parse(const std::string &t_input) + { + parser::ChaiScript_Parser parser; + if (parser.parse(t_input, "PARSE")) { + //parser.show_match_stack(); + return parser.optimized_ast(); + } else { + throw chaiscript::exception::eval_error("Unknown error while parsing"); + } + } + + static int version_major() { return chaiscript::version_major; diff --git a/unittests/parser_test.chai b/unittests/parser_test.chai new file mode 100644 index 0000000..05c2014 --- /dev/null +++ b/unittests/parser_test.chai @@ -0,0 +1,10 @@ +auto p = parse("5 + 4"); + +try { + assert_equal(eval(p), 9) +} catch (e) { + print(e.pretty_print()); + assert_true(false); +} + + From 3a595ef9123ce35975964312d032a8b1c903bf66 Mon Sep 17 00:00:00 2001 From: msbroadf Date: Thu, 13 Aug 2015 13:45:33 +1000 Subject: [PATCH 2/3] Update chaiscript_engine.hpp --- include/chaiscript/language/chaiscript_engine.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index a6a604a..9fbdd4c 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -36,7 +36,9 @@ #else #ifdef CHAISCRIPT_WINDOWS #define VC_EXTRA_LEAN +#if !defined(WIN32_LEAN_AND_MEAN) #define WIN32_LEAN_AND_MEAN +#endif #include #endif #endif From 781d62d3a532788e945adb768f42d9d617e0112e Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sat, 15 Aug 2015 07:29:07 -0600 Subject: [PATCH 3/3] Make result of dynamic constructor marked as return value --- include/chaiscript/dispatchkit/dynamic_object_detail.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/chaiscript/dispatchkit/dynamic_object_detail.hpp b/include/chaiscript/dispatchkit/dynamic_object_detail.hpp index 9d501ae..f1e20a1 100644 --- a/include/chaiscript/dispatchkit/dynamic_object_detail.hpp +++ b/include/chaiscript/dispatchkit/dynamic_object_detail.hpp @@ -232,7 +232,7 @@ namespace chaiscript protected: virtual Boxed_Value do_call(const std::vector ¶ms, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE { - auto bv = var(Dynamic_Object(m_type_name)); + auto bv = Boxed_Value(Dynamic_Object(m_type_name), true); std::vector new_params{bv}; new_params.insert(new_params.end(), params.begin(), params.end());