如何调试boost::spirit?已用调试节点但输出无明确匹配信息
Boost Spirit 调试输出优化方案
问题根源
你当前得到的类XML冗余输出,和calc_debug.cpp的清晰效果差距在于调试节点粒度不足和默认输出格式未调整。
具体优化步骤
给每个独立规则添加调试标记,而非仅顶层语法:
不要只给m_sGrammar设置调试,要为每个子规则(比如处理注释、属性的规则)单独命名并启用调试。示例代码:// 处理注释的子规则 qi::rule<Iterator, Comment()> comment_rule; comment_rule.name("comment_rule"); BOOST_SPIRIT_DEBUG_NODE(comment_rule); // 属性处理子规则 qi::rule<Iterator, Property()> property_rule; property_rule.name("property_rule"); BOOST_SPIRIT_DEBUG_NODE(property_rule);这样每个规则的匹配状态(try/success/fail)都会绑定具体名称,不会出现匹配文本对应不上规则的情况。
切换为非XML可读输出格式:
Boost Spirit默认输出XML格式,要改成和calc_debug.cpp一致的缩进文本格式,需在代码开头添加:#define BOOST_SPIRIT_DEBUG_OUT std::cout #define BOOST_SPIRIT_DEBUG_FLAGS BOOST_SPIRIT_DEBUG_FLAGS_NON_XML合理看待fail标记:
文件开头注释触发fail,是解析器先尝试匹配属性规则失败后回溯匹配注释的正常流程,无需关注这类回溯产生的fail,重点看导致解析终止的最终fail节点及其上下文。理解try/success标记逻辑:
try:解析器尝试用某规则匹配当前位置文本;success:该规则匹配成功,同时展示匹配的文本范围;- 同一文本多次出现
try,是解析器回溯时不同规则依次尝试匹配的正常流程。
内容的提问来源于stack exchange,提问作者Frank Puck
相关产品推荐
相关产品推荐

