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