精神错误处理:期望点未返回期望的“什么”值

时间:2019-04-13 21:52:34

标签: boost error-handling grammar boost-spirit

我正在使用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";
        }
    }
};

0 个答案:

没有答案