You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The expectation_failure<> failure in Spirit X3 which() function uses the mangled name when semantic actions are used. The minimal example folows below:
#include<boost/spirit/home/x3.hpp>
#include<boost/fusion/include/adapt_struct.hpp>
#include<boost/fusion/include/io.hpp>
#include<iostream>
#include<string>// if add a get_info struct for semantic actions then get expected token
#if0
namespace boost::spirit::x3 {
template <typename Derived, typename Action>
struct get_info<action<Derived, Action>>
{
typedef std::string result_type;
std::string operator()(action<Derived, Action> const& p) const
{
return get_info<Derived>()(p.subject);
}
};
}
#endif// Simple program to demonstrate expectation behavior with semantic actionsintmain() {
namespacex3= boost::spirit::x3;
using boost::spirit::x3::ascii::space;
typedef std::string::const_iterator iterator_type;
// invalid input to cause expect to fail
std::string input = "aabb";
// expect alone will print char as expected
{
auto iter = input.begin();
autoconst end = input.end();
try {
bool r = x3::phrase_parse(iter, end,
// begin gramar
(
x3::char_('a') > x3::char_('b')
)
,
// end gramar
space);
} catch (x3::expectation_failure<std::string::iterator> const& x) {
// catch and print the error object
std::cout << "Which :" << x.which() << std::endl;
}
}
// expect with semantic action print mangled name
{
auto semantic_action = [](auto &ctx) {};
auto iter = input.begin();
autoconst end = input.end();
try {
bool r = x3::phrase_parse(iter, end,
// begin gramar
(
x3::char_('a') > x3::char_('b')[semantic_action]
)
,
// end gramar
space);
} catch (x3::expectation_failure<std::string::iterator> const& x) {
// catch and print the error object
std::cout << "Which with semantic: " << x.which() << std::endl;
}
}
return0;
}
Which outputs the following results:
Which :'b'
Which with semantic: N5boost6spirit2x36actionINS1_12literal_charINS0_13char_encoding8standardEcEEZ4mainEUlRT_E_EE
If enable the code block above by chaning to #if 1 to enable:
The expectation_failure<> failure in Spirit X3 which() function uses the mangled name when semantic actions are used. The minimal example folows below:
Which outputs the following results:
If enable the code block above by chaning to
#if 1
to enable:It adds
get_info
for semantic actions that will print the info for underlying action which is what I expected originally:I wonder if the X3 library should already include this
get_info<>
specialization or if this causes issues with other use cases?The text was updated successfully, but these errors were encountered: