Boost::Spirit - on_error 未打印

Boost::Spirit - on_error not printing

我正在尝试使用 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
    );

这是我的 class,其中包含简单的 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 指的是什么?

我正在尝试调试一个语法,并且我已经输出了关于已匹配规则的信息,但是当规则不匹配时,我想知道是哪个规则以及为什么。

我正在使用:

研究:

错误处理只与期望值有关。这些你好像都没有。

调试语法使用

  • #define BOOST_SPIRIT_DEBUG 在任何提升之前包括
  • BOOST_SPIRIT_DEBUG_NODE(node)BOOST_SPIRIT_DEBUG_NODES((node1)(node2)...) 到 select 个节点进行调试

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

请注意,您的规则属性必须 fusion-adapted/streamable 才能进行调试。