【问题标题】:How can I use the skipper ascii::space WITHOUT skipping eol?如何在不跳过 eol 的情况下使用船长 ascii::space?
【发布时间】:2012-05-15 00:00:13
【问题描述】:

我必须使用 boost::spirit 进行解析,我想使用phrase_parse函数:

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol); 

但是我的编译器不允许第四项(ascii::space - qi::eol)。 如何在不跳过 eol 的情况下使用船长 ascii::space ?

【问题讨论】:

  • 编译器对ascii::space - qi::eol 的问题到底是什么?这将对可能的解决方案产生重大影响。
  • @rhalbersma:但那里似乎没有给出可编译的解决方案。
  • 在“可能的重复”中,解决方案是 ascii::space - eol 作为船长,但是“- eol”是不允许的,这是我的问题,我想跳过 ascii::space 而不是 qi ::eol

标签: c++ parsing boost boost-spirit boost-spirit-qi


【解决方案1】:

最简单的答案是

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::blank); 

当然,这也取决于你的语法:如果它需要一个特定的船长类,你可能需要改变它。 请参阅下面的通用处理方法(尽管您可以指定 qi::blank_type 来表示只应接受 qi::blank 的语法)。

该示例也可以处理任意船长。

其他提示

Spirit 有几个指令会影响船长的使用:​​

  • qi::lexeme

    将解析子表达式而不管skipper(对于例如语法中的字符串文字很有用)

  • qi::raw

    将返回原始源迭代器范围,这意味着跳过的输入将包含在结果中

  • qi::no_skip, qi::skip

    可用于显式更改用于子表达式的船长类型

推荐阅读

Boost Spirit 网站上有一篇关于此类事情的精彩文章

通用示例

#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

template <typename It, typename Skipper>
    struct parser : qi::grammar<It, Skipper>
{
    parser() : parser::base_type(start)
    {
        start = *qi::int_;
    }

  private:
    qi::rule<It, Skipper> start;
};

template <typename C, typename Skipper>
    void doParse(const C& input, const Skipper& skipper)
{
    auto f(std::begin(input)), l(std::end(input));

    parser<decltype(f), Skipper> p;
    bool ok = qi::phrase_parse(f,l,p,skipper);

    if (ok)   
        std::cout << "parse success\n";
}

int main()
{
    const std::string input = "1 2 3 4";
    doParse(input, qi::blank);
    doParse(input, qi::space);
    doParse(input, ~qi::char_("0-9"));
}

【讨论】:

  • +1 正是我想要将一堆迷你解析器(一次只处理一行)粘合在一起的东西
  • 如果规则采用输出类型(如std::string()),Skipper 会去哪里?
  • 括号真的很重要"(尽管你可以只为应该只接受 qi::blank 的语法指定 qi::blank_type)。" 虽然有些可疑,因为现在我必须将所有语法更改为qi::blank_type,即使子标记不需要知道eol。我猜是因为我还没有像个精神者那样思考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多