Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法在boost spirit中指定跳过程序(编译器错误)_C++_Boost_Boost Spirit - Fatal编程技术网

C++ 无法在boost spirit中指定跳过程序(编译器错误)

C++ 无法在boost spirit中指定跳过程序(编译器错误),c++,boost,boost-spirit,C++,Boost,Boost Spirit,我正在尝试使用boost::spirit构建一个解析器,除了其他东西之外,它还应该能够解析诸如“(3,4)”之类的整数对 我的代码正在运行,但我也希望接受包含空格的对,即“(4,6)”。当尝试添加如图所示的space\u typeskipper时,以下代码无法编译。我看不出我犯的严重错误(我怀疑使用了错误的名称空间,但它似乎是正确的名称空间) #包括 #包括 #包括 #包括 使用名称空间std; 使用名称空间boost::spirit::qi; 使用position=std::pair; 模板

我正在尝试使用
boost::spirit
构建一个解析器,除了其他东西之外,它还应该能够解析诸如“(3,4)”之类的整数对

我的代码正在运行,但我也希望接受包含空格的对,即“(4,6)”。当尝试添加如图所示的
space\u type
skipper时,以下代码无法编译。我看不出我犯的严重错误(我怀疑使用了错误的名称空间,但它似乎是正确的名称空间)

#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间boost::spirit::qi;
使用position=std::pair;
模板
结构位置语法:语法{
位置语法():位置语法::基本类型(开始){
开始=点亮(“(”>>int_>>lit(“,”>>int_>>lit(“)”);
}
规则启动;
};
int main(){
std::string s=“(1,2)”;
位置语法;
位置p;
boolr=parse(s.begin(),s.end(),grammar,p);

cout如果希望使用skipper,必须通过调用
phrase\u parse
而不是
parse
来传递它的实例:

bool r = phrase_parse(s.begin(), s.end(), grammar, qi::space, p);
或者,您可以使用
skip(qi::space)[real\u start\u rule\u with\u skipper]

另见:

注:

  • 不要同时使用
    使用命名空间
    -尤其是
    std
    boost::spirit::qi
    。您可以始终在本地使用
    使用命名空间qi;
  • 无需在
    lit()
    中包装所有文字。以下是简化的规则:

    position_rule = '(' >> qi::int_ >> ',' >> qi::int_ >> ')';
    
演示

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

namespace qi = boost::spirit::qi;

using position = std::pair<int, int>;

template <typename Iterator> struct position_grammar : qi::grammar<Iterator, position()> {
    position_grammar() : position_grammar::base_type(start) {

        position_rule = '(' >> qi::int_ >> ',' >> qi::int_ >> ')';
        start         = qi::skip(boost::spirit::ascii::space) [ position_rule ];

    }
    qi::rule<Iterator, position()> start;
    qi::rule<Iterator, position(), boost::spirit::ascii::space_type> position_rule;
};

int main() {
    std::string s = "  ( 1\t,\r\n2 )";
    position_grammar<std::string::iterator> grammar;
    position p;

    bool r = parse(s.begin(), s.end(), grammar, p);

    std::cout << "parsing: " << r << " position: " << p.first << ", " << p.second << "\n";
}
position_rule = '(' >> qi::int_ >> ',' >> qi::int_ >> ')';
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>

namespace qi = boost::spirit::qi;

using position = std::pair<int, int>;

template <typename Iterator> struct position_grammar : qi::grammar<Iterator, position()> {
    position_grammar() : position_grammar::base_type(start) {

        position_rule = '(' >> qi::int_ >> ',' >> qi::int_ >> ')';
        start         = qi::skip(boost::spirit::ascii::space) [ position_rule ];

    }
    qi::rule<Iterator, position()> start;
    qi::rule<Iterator, position(), boost::spirit::ascii::space_type> position_rule;
};

int main() {
    std::string s = "  ( 1\t,\r\n2 )";
    position_grammar<std::string::iterator> grammar;
    position p;

    bool r = parse(s.begin(), s.end(), grammar, p);

    std::cout << "parsing: " << r << " position: " << p.first << ", " << p.second << "\n";
}
parsing: 1 position: 1, 2