클래스를 iostream 구문 분석 파싱을 정신 파서로 통합하는 데 문제가 있습니다. 아래의 예 (성령의 예에서 수정 됨)는 문제를 보여줍니다. 사용자 지정 클래스 만 구문 분석하려고하면 첫 번째 구문 분석에 의해 표시된 으로 성공하고 assert를 호출합니다. 사용자 지정 클래스와이 경우 쉼표 및 부동 소수를 구문 분석하려고하면 파서가 실패합니다.boost :: spirit stream_parser가 너무 많이 소비합니까?
왜 이럴 수 있습니까? 스트림 파서 대신에 영혼 파서 을 사용하면 두 번째 예제를 사용할 수 있지만 은 stream_parser를 사용하는 목적을 상쇄합니다. ...
그러나, 코드가이 일을해서는 안 보여줍니다 -내 지역의 예에서 규칙 디버깅을 사용하도록 설정하고이 사용자 정의 파서가 문자열의 전체 내용을 소비하는 것을 보여줍니다
도움을 주시면 감사하겠습니다. 이 스트림 파서 구성 요소의 버그로 밝혀졌다 4.1.1
#include <boost/spirit/include/qi.hpp>
struct complex
{
complex (double a = 0.0, double b = 0.0) : a(a), b(b) {}
double a,b;
};
std::istream& operator>> (std::istream& is, complex& z)
{
char lbrace = '\0', comma = '\0', rbrace = '\0';
is >> lbrace >> z.a >> comma >> z.b >> rbrace;
if (lbrace != '{' || comma != ',' || rbrace != '}')
is.setstate(std::ios_base::failbit);
return is;
}
int main(int argc, char**argv)
{
using namespace boost::spirit;
complex parsedComplex;
float parsedFloat;
bool result;
std::string str = "{1.0,2.5}";
std::string::iterator first = str.begin();
result = qi::phrase_parse(first,str.end(),
qi::stream_parser<char,complex>(), ascii::blank,parsedComplex);
assert(result && first==str.end()); // OK
str = "{1.0,2.5},123.456";
first = str.begin();
result = qi::phrase_parse(first,str.end(),
qi::stream_parser<char,complex>() >> qi::lit(',') >> qi::float_,
ascii::blank,parsedComplex,parsedFloat);
assert(result && first==str.end()); // FAILS
}
참을성을 느끼지 마십시오. 조사 중입니다 ... – hkaiser
감사합니다. Hartmut! –