Flesh out parser and tracer usage cases
This commit is contained in:
parent
ffcd7e3a76
commit
359897a442
@ -307,6 +307,10 @@ namespace chaiscript
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parser::ChaiScript_Parser_Base &get_parser()
|
||||||
|
{
|
||||||
|
return *m_parser;
|
||||||
|
}
|
||||||
|
|
||||||
const Boxed_Value eval(const AST_NodePtr &t_ast)
|
const Boxed_Value eval(const AST_NodePtr &t_ast)
|
||||||
{
|
{
|
||||||
|
@ -355,6 +355,16 @@ namespace chaiscript
|
|||||||
m_match_stack.reserve(2);
|
m_match_stack.reserve(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tracer &get_tracer()
|
||||||
|
{
|
||||||
|
return m_tracer;
|
||||||
|
}
|
||||||
|
|
||||||
|
Optimizer &get_optimizer()
|
||||||
|
{
|
||||||
|
return m_optimizer;
|
||||||
|
}
|
||||||
|
|
||||||
ChaiScript_Parser(const ChaiScript_Parser &) = default;
|
ChaiScript_Parser(const ChaiScript_Parser &) = default;
|
||||||
ChaiScript_Parser &operator=(const ChaiScript_Parser &) = delete;
|
ChaiScript_Parser &operator=(const ChaiScript_Parser &) = delete;
|
||||||
ChaiScript_Parser(ChaiScript_Parser &&) = default;
|
ChaiScript_Parser(ChaiScript_Parser &&) = default;
|
||||||
|
@ -10,10 +10,11 @@
|
|||||||
namespace chaiscript {
|
namespace chaiscript {
|
||||||
namespace eval {
|
namespace eval {
|
||||||
|
|
||||||
struct Noop_Tracer
|
|
||||||
|
struct Noop_Tracer_Detail
|
||||||
{
|
{
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static void trace(const chaiscript::detail::Dispatch_State &, const AST_Node_Impl<T> *)
|
void trace(const chaiscript::detail::Dispatch_State &, const AST_Node_Impl<T> *)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -28,7 +29,7 @@ namespace chaiscript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void do_trace(const chaiscript::detail::Dispatch_State &ds, const AST_Node_Impl<Tracer<T...>> *node) {
|
void do_trace(const chaiscript::detail::Dispatch_State &ds, const AST_Node_Impl<Tracer<T...>> *node) {
|
||||||
(void)std::initializer_list<int>{ (T::trace(ds, node), 0)... };
|
(void)std::initializer_list<int>{ (static_cast<T&>(*this).trace(ds, node), 0)... };
|
||||||
}
|
}
|
||||||
|
|
||||||
static void trace(const chaiscript::detail::Dispatch_State &ds, const AST_Node_Impl<Tracer<T...>> *node) {
|
static void trace(const chaiscript::detail::Dispatch_State &ds, const AST_Node_Impl<Tracer<T...>> *node) {
|
||||||
@ -36,6 +37,8 @@ namespace chaiscript {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef Tracer<Noop_Tracer_Detail> Noop_Tracer;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -988,6 +988,34 @@ TEST_CASE("Make sure ChaiScript object still compiles / executes")
|
|||||||
chaiscript::ChaiScript chai;
|
chaiscript::ChaiScript chai;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Count_Tracer
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
template<typename T>
|
||||||
|
void trace(const chaiscript::detail::Dispatch_State &, const chaiscript::eval::AST_Node_Impl<T> *)
|
||||||
|
{
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
TEST_CASE("Test count tracer")
|
||||||
|
{
|
||||||
|
typedef chaiscript::parser::ChaiScript_Parser< chaiscript::eval::Tracer<Count_Tracer>, chaiscript::optimizer::Optimizer_Default > Parser_Type;
|
||||||
|
|
||||||
|
chaiscript::ChaiScript_Basic chai(chaiscript::Std_Lib::library(),
|
||||||
|
std::make_unique<Parser_Type>());
|
||||||
|
|
||||||
|
Parser_Type &parser = dynamic_cast<Parser_Type &>(chai.get_parser());
|
||||||
|
|
||||||
|
const auto count = parser.get_tracer().count;
|
||||||
|
|
||||||
|
chai.eval("");
|
||||||
|
|
||||||
|
CHECK(parser.get_tracer().count > count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("Test stdlib options")
|
TEST_CASE("Test stdlib options")
|
||||||
{
|
{
|
||||||
const auto test_has_external_scripts = [](chaiscript::ChaiScript_Basic &chai) {
|
const auto test_has_external_scripts = [](chaiscript::ChaiScript_Basic &chai) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user