精神:无法在其规则定义中使用x3 :: skip(skipper)[某些递归规则]

时间:2017-07-24 13:44:56

标签: c++ boost boost-spirit boost-spirit-x3

让我们说我们要解析这样的递归块。当" 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_casex3::with也存在此问题,因为它们都在实现中使用x3::make_context

问题:

  1. 总是有更好的方法来为这种类型编写解析器 问题,以避免这样的编译错误和如何?
  2. x3::make_context实施是否被视为对此类问题存在缺陷?

1 个答案:

答案 0 :(得分:1)

老实说,我确实认为这是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我觉得&#34;序列分区&#34;问题无关)