Boost :: Spirit - on_error不打印

时间:2015-03-25 23:34:16

标签: c++ parsing error-handling boost-spirit boost-spirit-qi

我正在尝试使用Boost :: Spirit :: qi的on_error机制来找出解析失败的原因。

我在on_error函数设置了一个断点,并且正在调用该函数,但是没有输出(nada,nothing,void,...)。

简单的on_error

on_error<fail>(level1,
    boost::phoenix::ref(std::cout) << "I've failed.\n"
    );

复杂on_error(来自各个网站):

on_error<fail>
(
    start,
    boost::phoenix::ref(std::cout)
        << val("Error! Expecting ")
        << _4
        << val(" here: \"")
        << construct<std::string>(qi::_3, qi::_2)
        << val("\"")
        << std::endl
    );

这是我的类,其中包含简单的on_error

template <typename Iterator, typename Skipper>
struct Event_Compound
    : qi::grammar<Iterator, Skipper>
{
    Event_Compound () 
        : Event_Compound::base_type(start, "Compound-Event")
        {
            using qi::lexeme;
            using qi::lit;
            using namespace qi;
            using boost::spirit::ascii::char_;

            relational_operator =
                lit("&&")[Matched_Relational_AND]
                || lit("||")[Matched_Relational_OR]
                ;

            compound =
                level1[Matched_Nested_Level1_Begin] >> relational_operator[Matched_Relational_Operator] >> level1[Matched_Nested_Level1_End]
                ;

            compare_or_compound =
                compound[Matched_Compound] | grammar_comparison_event[Matched_Comparison_Event]
                ;

            level1 =
                grammar_boolean_event[Matched_Boolean_Event]
                | ( char_('(')[Matched_Open_Paren] >> compare_or_compound[Matched_Compare_Or] >> char_(')')[Matched_Close_Paren]  )
                ;

            start =
                level1[Matched_Level1_Begin] >> relational_operator[Matched_Relational_Operator] >> level1[Matched_Level1_End]
                ;
            on_error<fail>(level1,
                boost::phoenix::ref(std::cout) << "I've failed.\n"
                );
        }

    Event_Boolean<Iterator, Skipper>        grammar_boolean_event;
    Event_Comparison<Iterator, Skipper>     grammar_comparison_event;
    qi::rule<Iterator, Skipper>             level1;
    qi::rule<Iterator, Skipper>             compound;
    qi::rule<Iterator, Skipper>             compare_or_compound;
    qi::rule<Iterator, Skipper>             relational_operator;
    qi::rule<Iterator, Skipper>             start;
};

是否有简单的方法来跟踪解析器的行为或思维模式? (例如设置预处理器宏或某些标志变量)

为什么on_error没有任何输出?

此外,_1, _2, _3_4会引用什么?

我正在尝试调试语法,并且我已经输出了匹配的规则,但是当规则不匹配时,我想知道哪个规则和原因。

我正在使用:

  • 提升1.57.0
  • Visual Studio 2010
  • Windows 7

研究:

1 个答案:

答案 0 :(得分:3)

错误处理仅与期望点有关。你似乎没有任何这些。

调试语法使用

    在任何提升之前
  • #define BOOST_SPIRIT_DEBUG包括
  • BOOST_SPIRIT_DEBUG_NODE(node)BOOST_SPIRIT_DEBUG_NODES((node1)(node2)...)选择要调试的节点

这将向您显示回溯(如果有)和属性传播。如果使用它们,也会显示本地和继承的属性。

请注意,您的规则属性需要进行融合调整/流式处理才能使调试正常工作。