假设我们想解析这样的递归块。当 "skip_comments_tag
" 以块为前缀时,我们递归跳过该块中的所有注释(/*...*/
(。
{
{}
{
skip_comments_tag{
{} /*comments*/
{ /*comments*/ }
}
}
}
像在 Coliru 中那样想出一个递归解析器很容易。
namespace Parser {
auto const ruleComment = x3::lit("/*") >> *(x3::char_ - "*/") >> "*/" | x3::space;
x3::rule<struct SBlockId> const ruleBlock;
auto const ruleBlock_def = x3::lit('{') >> *(ruleBlock | "skip_comments_tag" >> x3::skip(ruleComment)[ruleBlock]) >> '}';
BOOST_SPIRIT_DEFINE(ruleBlock)
}
但它不会编译(当调用parse
函数时(,因为它会生成无限的上下文(通过x3::make_context
x3::skip_directive
(。x3::no_case
和x3::with
也有这个问题,因为它们在实现中都使用x3::make_context
。
问题:
- 是否总是有更好的方法来为这种 避免此类编译错误的问题以及如何避免?
- 还是
x3::make_context
实现被认为对此类问题有缺陷?
老实说,我确实认为这是make_context
设施的限制,是的,它以前咬过我。
您可以通过使用 TU 分隔 (BOOST_SPIRIT_DECLARE
、BOOST_SPIRIT_DEFINE
和BOOST_SPIRIT_INSTANTIATE
宏(。
老实说,我会在邮件列表中报告:[精神将军]
另见 http://boost.2283326.n4.nabble.com/Horrible-compiletimes-and-memory-usage-while-compiling-a-parser-with-X3-td4689104i20.html(FWIW 我觉得"序列分区"问题无关(