【问题标题】:Boost Spirit lexeme vs no_skipBoost Spirit lexeme vs no_skip
【发布时间】:2020-08-03 17:44:03
【问题描述】:

就像Boost.Spirit 上的描述一样,lexeme 和 no_skip 之间的唯一区别是 pre_skip。

但经过一些测试,我仍然对 pre_skip 的确切含义感到困惑。

那么什么样的条件会有所不同,也许举个例子可以帮助我更好地理解它。

谢谢!

【问题讨论】:

    标签: c++ boost boost-spirit


    【解决方案1】:

    预跳过忽略表达式开头的空格。

    对比:

    Live On Coliru

    #include <boost/spirit/include/qi.hpp>
    
    namespace qi = boost::spirit::qi;
    static std::string const input = " 42j";
    
    int main() {
        auto run_test = [](auto p) {
            auto f = input.begin(), l = input.end();
            int i;
            return qi::phrase_parse(f, l, p, qi::space, i)
                ? std::to_string(i)
                : "unparsed";
        };
    
        std::cout << "no_skip: " << run_test(qi::no_skip[ qi::int_ >> 'j' ]) << "\n";
        std::cout << "lexeme: "  << run_test(qi::lexeme[ qi::int_ >> 'j' ]) << "\n";
    }
    

    打印:

    no_skip: unparsed
    lexeme: 42
    

    如您所见,lexeme 会默默地吃掉领先的空白。 这是预跳过。

    【讨论】:

    • 很好的解释!似乎我以错误的方式测试了 lexeme 和 no_skip。谢谢你的解释!
    • 刚刚意识到我可以让测试器更简洁:Live。当然并没有真正改变任何东西:)
    • 哦,我关于船长的标准背景资料在这里:stackoverflow.com/questions/17072987/… - 当然它并没有完全提供这样的例子
    • 我在搜索该主题时查看了该问题,但没有简洁的示例。既然你提供了它,我就可以意识到这些之间的区别。其实我之前已经猜到了答案,但也许我的测试代码有点复杂,以至于一些其他因素影响了测试结果。我要去看看。再次感谢您的积极回应。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多