考虑以下解析器:
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")];
}