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
指的是什么?
我正在尝试调试一个语法,并且我已经输出了关于已匹配规则的信息,但是当规则不匹配时,我想知道是哪个规则以及为什么。
我正在使用:
- 提升 1.57.0
- Visual Studio 2010
- Windows 7
研究:
错误处理只与期望值有关。这些你好像都没有。
调试语法使用
#define BOOST_SPIRIT_DEBUG
在任何提升之前包括
BOOST_SPIRIT_DEBUG_NODE(node)
或 BOOST_SPIRIT_DEBUG_NODES((node1)(node2)...)
到 select 个节点进行调试
这将向您展示回溯(如果有)和属性传播的作用。如果您使用它们,本地和继承的属性也会显示。
请注意,您的规则属性必须 fusion-adapted/streamable 才能进行调试。
我正在尝试使用 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
指的是什么?
我正在尝试调试一个语法,并且我已经输出了关于已匹配规则的信息,但是当规则不匹配时,我想知道是哪个规则以及为什么。
我正在使用:
- 提升 1.57.0
- Visual Studio 2010
- Windows 7
研究:
错误处理只与期望值有关。这些你好像都没有。
调试语法使用
#define BOOST_SPIRIT_DEBUG
在任何提升之前包括BOOST_SPIRIT_DEBUG_NODE(node)
或BOOST_SPIRIT_DEBUG_NODES((node1)(node2)...)
到 select 个节点进行调试
这将向您展示回溯(如果有)和属性传播的作用。如果您使用它们,本地和继承的属性也会显示。
请注意,您的规则属性必须 fusion-adapted/streamable 才能进行调试。