精神:不能在其规则定义中使用x3::skip(skipper)[一些递归规则]



假设我们想解析这样的递归块。当 "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_contextx3::skip_directive(。x3::no_casex3::with也有这个问题,因为它们在实现中都使用x3::make_context

问题:

  1. 是否总是有更好的方法来为这种 避免此类编译错误的问题以及如何避免?
  2. 还是x3::make_context实现被认为对此类问题有缺陷?

老实说,我确实认为这是make_context设施的限制,是的,它以前咬过我。

您可以通过使用 TU 分隔 (BOOST_SPIRIT_DECLAREBOOST_SPIRIT_DEFINEBOOST_SPIRIT_INSTANTIATE宏(。

老实说,我会在邮件列表中报告:[精神将军]

另见 http://boost.2283326.n4.nabble.com/Horrible-compiletimes-and-memory-usage-while-compiling-a-parser-with-X3-td4689104i20.html(FWIW 我觉得"序列分区"问题无关(

最新更新