我正在使用http://boost-spirit.com/home/2011/02/28/dispatching-on-expectation-point-failures/comment-page-1/(文章的最后一个示例)上的“预期点故障时分派”文章中的Spirit错误处理代码。我的“诊断”和“ error_handler_impl”类与文章中的类几乎相同,但是如果有人认为有必要,我可以发布它们。
在下面的代码中,相关的起始规则
comma = lit(',');
comma.name(",");
start = lit("begin") >> ident > comma >> ident;
在“ begin”关键字之后有一个期望点。根据该文章,我希望缺少逗号将导致错误处理程序将qi :: _ 4值传递为“,”,这是逗号规则的名称。而是,它传递“序列”,从而导致错误处理程序打印默认消息,而不是提示性的“ begin关键字后缺少逗号”。
一个想法,我想念的是什么?
template <typename Iterator, typename Skipper = ascii::space_type>
class Grammar1 : boost::spirit::qi::grammar<Iterator, Skipper>
{
public:
typedef boost::spirit::qi::rule<Iterator, Skipper> rule_nil_T;
typedef boost::spirit::qi::rule<Iterator, string()> rule_str_T;
// structs from Rob Stewart's above-mentioned article
diagnostics<10> d1;
boost::phoenix::function<error_handler_impl> error_handler;
rule_str_T ident;
rule_nil_T comma;
rule_nil_T start;
Grammar1(void) : Grammar1::base_type(start)
{
ident %= lexeme [ qi::raw [ (qi::alpha | '_') >> *(qi::alnum | '_') ] ];
comma = lit(',');
comma.name(",");
start = lit("begin") >> ident > comma >> ident;
d1.add(",", "Missing comma after begin keyword");
on_error<fail>(start,
error_handler(ref(d1), _1, _2, _3, _4));
}
~Grammar1(void) { };
void parseInputFile(Iterator itr, Iterator itr_end)
{
bool r = phrase_parse(itr, itr_end, start, ascii::space);
if (r && itr == itr_end)
{
std::cout << "Parsing succeeded\n";
} else
{
string rest(itr, itr_end);
std::cout << "stopped at: \": " << rest << "\"\n";
}
}
};