让我们说我们要解析这样的递归块。当" 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
实施是否被视为对此类问题存在缺陷?答案 0 :(得分:1)
老实说,我确实认为这是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我觉得&#34;序列分区&#34;问题无关)