2

boost::spirit::qi用来解析看起来像这样的“模板”格式:

/path/to/:somewhere:/nifty.json

其中:somewhere:表示由名称标识的任何字符串somewhere(名称可以是两个字符之间的任意一系列:字符)。我有一个可以工作的解析器,但我想做一个额外的改进。

我想知道:somewhere:占位符后面的字符(在本例中为 a /)。但是我的解析器的其余部分仍然需要了解这一点/并将其作为下一部分的一部分使用。

我如何在不实际使用它的情况下“读取”/之后:somewhere:的内容,以便解析器的其余部分可以看到并使用它。

4

2 回答 2

8

你正在寻找

例子:

 myrule = lexeme [ *~char_(":") ] >> ":" >>
       (  (&lit('/') >> absolute_path)
        | (relative_path)
       )
于 2013-02-13T15:18:49.897 回答
2

正如 sehe 所提到的,这可以使用前瞻解析器运算符 &来完成,但如果你也想发出字符,你还需要boost.phoenixqi::localsqi::attr

例如:

#include <boost/fusion/include/std_pair.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/qi.hpp>

#include <iostream>
#include <string>

namespace qi = boost::spirit::qi;

int main(int argc, char** argv)
{
    std::string input("foo:/bar");
    std::pair<char, std::string> output;

    std::string::const_iterator begin = input.begin(),
                                end = input.end();

    qi::rule<std::string::const_iterator, qi::locals<char>, std::pair<char, std::string>()> duplicate =
          "foo"
       >> qi::omit[
             &(":" >> qi::char_[qi::_a = qi::_1])
          ]
       >> qi::attr(qi::_a)
       >> ":"
       >> *qi::char_;

    bool r = qi::parse(begin,
                       end,
                       duplicate,
                       output);

    std::cout << std::boolalpha
              << r << " "
              << (begin == end) << " '"
              << output.first << "' \""
              << output.second << "\""
              << std::endl;

    return 0;
}

这输出:

true true '/' "/bar"
于 2013-02-13T16:04:43.663 回答