Рассмотрим следующий парсер:
class test
{
public:
static test from_string(const string &str); //throws!
};
template <typename Iterator = string::const_iterator>
struct test_parser : grammar<Iterator, test(), blank_type>
{
test_parser() : test_parser::base_type(query)
{
query = id[_val = phx::bind(&test::from_string, qi::_1)];
id = lexeme[*char_("a-zA-Z_0-9")];
}
rule<Iterator, test(), blank_type> query;
rule<Iterator, string(), blank_type> id;
};
Я хотел бы перехватывать исключения, которые test::from_string
может вызвать, и не выполнять совпадение при исключении. Мне не удалось найти прямой способ сделать это, поэтому я пытаюсь использовать функцию «адаптера», которая явно принимает контекст. Но как получить доступ к контексту и как привязать такое действие к грамматике? Пожалуйста, смотрите вопросы в коде:
template<class Context>
void match_test(const string &attr, Context &context, bool &mFlag)
{
try
{
test t = test::from_string(attr);
// how do I access the context to put t into _val?
}
catch(...)
{
mFlag = false;
}
}
//...
test_parser() : test_parser::base_type(query)
{
query = id[?match_test<?>? /*how to instantiate and use the above semantic action?*/];
id = lexeme[*char_("a-zA-Z_0-9")];
}
boost::fusion::at_c<0>(context.attributes) = t;
. Другой альтернативой, которая, я думаю, должна работать, но я никогда не тестировал, было бы использованиеquery = id[phx::try_[_val = phx::bind(&test::from_string, qi::_1)].catch_all[_pass=false] ];
. - person llonesmiz   schedule 28.10.2013phx::try_[].catch_all[]
, похоже, работает только с Phoenix v2. - person llonesmiz   schedule 28.10.2013try_catch
в последовательность, например добавивstd::cout << phx::val("testing...")
или что-то глупое, напримерqi::_1=qi::_1
, он компилируется. Я не знаю достаточно, чтобы быть уверенным, но я думаю, что код, который имеет дело с семантическими действиями, неявно ожидает некоторых требований от выражений феникса, а try_catch им не соответствует. - person llonesmiz   schedule 28.10.2013try_catch
шаблонов выражений. - person sehe   schedule 28.10.2013try_catch
именно то, что мне нужно. - person Igor R.   schedule 28.10.2013