Changed to allow 'mutable' lambda function as semantic action. Closed #2.

This commit is contained in:
yhirose 2015-02-18 19:41:18 -05:00
parent 6cc1534257
commit f7e7e308ed
2 changed files with 42 additions and 0 deletions

View File

@ -284,6 +284,11 @@ private:
return TypeAdaptor<R>(fn); return TypeAdaptor<R>(fn);
} }
template<typename F, typename R>
Fty make_adaptor(F fn, R (F::*mf)(const char*, size_t, const std::vector<any>& v, any& c)) {
return TypeAdaptor<R>(fn);
}
template<typename F, typename R> template<typename F, typename R>
Fty make_adaptor(F fn, R(*mf)(const char*, size_t, const std::vector<any>& v, any& c)) { Fty make_adaptor(F fn, R(*mf)(const char*, size_t, const std::vector<any>& v, any& c)) {
return TypeAdaptor<R>(fn); return TypeAdaptor<R>(fn);
@ -294,6 +299,11 @@ private:
return TypeAdaptor_s_l_v<R>(fn); return TypeAdaptor_s_l_v<R>(fn);
} }
template<typename F, typename R>
Fty make_adaptor(F fn, R (F::*mf)(const char*, size_t, const std::vector<any>& v)) {
return TypeAdaptor_s_l_v<R>(fn);
}
template<typename F, typename R> template<typename F, typename R>
Fty make_adaptor(F fn, R(*mf)(const char*, size_t, const std::vector<any>& v)) { Fty make_adaptor(F fn, R(*mf)(const char*, size_t, const std::vector<any>& v)) {
return TypeAdaptor_s_l_v<R>(fn); return TypeAdaptor_s_l_v<R>(fn);
@ -304,6 +314,11 @@ private:
return TypeAdaptor_s_l<R>(fn); return TypeAdaptor_s_l<R>(fn);
} }
template<typename F, typename R>
Fty make_adaptor(F fn, R (F::*mf)(const char*, size_t)) {
return TypeAdaptor_s_l<R>(fn);
}
template<typename F, typename R> template<typename F, typename R>
Fty make_adaptor(F fn, R (*mf)(const char*, size_t)) { Fty make_adaptor(F fn, R (*mf)(const char*, size_t)) {
return TypeAdaptor_s_l<R>(fn); return TypeAdaptor_s_l<R>(fn);
@ -314,6 +329,11 @@ private:
return TypeAdaptor_v_n<R>(fn); return TypeAdaptor_v_n<R>(fn);
} }
template<typename F, typename R>
Fty make_adaptor(F fn, R (F::*mf)(const std::vector<any>& v, any& c)) {
return TypeAdaptor_v_n<R>(fn);
}
template<typename F, typename R> template<typename F, typename R>
Fty make_adaptor(F fn, R (*mf)(const std::vector<any>& v, any& c)) { Fty make_adaptor(F fn, R (*mf)(const std::vector<any>& v, any& c)) {
return TypeAdaptor_v_n<R>(fn); return TypeAdaptor_v_n<R>(fn);
@ -324,6 +344,11 @@ private:
return TypeAdaptor_v<R>(fn); return TypeAdaptor_v<R>(fn);
} }
template<typename F, typename R>
Fty make_adaptor(F fn, R (F::*mf)(const std::vector<any>& v)) {
return TypeAdaptor_v<R>(fn);
}
template<typename F, typename R> template<typename F, typename R>
Fty make_adaptor(F fn, R (*mf)(const std::vector<any>& v)) { Fty make_adaptor(F fn, R (*mf)(const std::vector<any>& v)) {
return TypeAdaptor_v<R>(fn); return TypeAdaptor_v<R>(fn);
@ -334,6 +359,11 @@ private:
return TypeAdaptor_empty<R>(fn); return TypeAdaptor_empty<R>(fn);
} }
template<typename F, typename R>
Fty make_adaptor(F fn, R (F::*mf)()) {
return TypeAdaptor_empty<R>(fn);
}
template<typename F, typename R> template<typename F, typename R>
Fty make_adaptor(F fn, R (*mf)()) { Fty make_adaptor(F fn, R (*mf)()) {
return TypeAdaptor_empty<R>(fn); return TypeAdaptor_empty<R>(fn);

View File

@ -183,6 +183,18 @@ TEST_CASE("Backtracking test", "[general]")
REQUIRE(count == 2); REQUIRE(count == 2);
} }
TEST_CASE("mutable lambda test", "[general]")
{
vector<string> vec;
peg pg("ROOT <- 'mutable lambda test'");
// This test makes sure if the following code can be compiled.
pg["TOKEN"] = [=](const char* s, size_t l) mutable {
vec.push_back(string(s, l));
};
}
TEST_CASE("Simple calculator test", "[general]") TEST_CASE("Simple calculator test", "[general]")
{ {
auto syntax = auto syntax =