2016-12-07 8 views
4

시험에서 얻을 수있는 qi::uint_parser<int>()qi::uint_와 같습니다. 그들은 0에서 UINT_MAX까지 정수를 파싱합니다.qi :: uint_parser <int>()은 정확히 구문 분석해야합니까?

내가 이해할 수없는 점은 qi::uint_parser은 숫자 유형에 대해 std::numeric_limits<T>::max()이 유효해야한다는 것입니다. 은 0에서 std::numeric_limits<int>::max()이 아닌 정수를 구문 분석한다고 가정해야하는지 잘 모르겠습니다. std::numeric_limits<unsigned int>::max()이 아닙니다. 아니면이 요구 사항은 파서의 범위와 관련이 없습니까?

답변

0

이 글은 How to write a boost::spirit::qi parser to parse an integer range from 0 to std::numeric_limits<int>::max()?과 내가 메일 링리스트에서 본 기억이 중복 된 것 같습니다.

명백하게 문서화되지 않았으므로 테스트를 받았습니까?

또는이 요구 사항은 파서의 범위와 관련이 없습니까?

나는 후자가 될 것으로 기대한다. 속성 유형이 파서가 아닌 속성에 대해 뭔가를 말하기를 기대합니다. 구문 분석기는 특성 전파를 특성에 할당합니다. 우려의 분리.

속성 전파는 C++ 언어가 수행하는 암시 적 변환을 수행하기 쉽습니다. 이것은 실제로 scanf("%d")unsigned을 사용하거나 std::istream를 사용하여 서명되지 않은 INT를 읽고 다르지 않다 : C++에서

실제로 이것은 문제의 근원입니다. Spirit은 , qi::uint_ 및 친구들을 정의합니다. 기본 qi::[u]int_parser<> 템플릿을 사용하여 사용자 정의 조합을 자갈하면 컴파일러에게 "내가하는 일을 잘 알고있다"고 말합니다.

면책 조항 :이 모든 내용은 신뢰할 수 없습니다. 나는 심지어 코드/문서를 확인하지 않았다. 나는 그것이 본질적으로 더 나은 질문에 관한 문서화 문제라고 생각한다. mailing list

+1

[docs] (http://www.boost.org/doc/libs/1_62_0/libs/spirit/doc/)에서이 비트는 어떻게 될까? html/spirit/qi/reference/numeric/uint.html)? "모든 숫자 파서는 해당 uint_parser <>가 인스턴스화 된 유형 T를 기반으로 오버플로 조건을 확인합니다. 파싱 된 숫자가이 유형을 오버플로하면 구문 분석이 실패합니다. 오버플로 검사는 제공된 유형에 기반하지 않습니다 속성이지만 템플릿 매개 변수 T에만 의존합니다. " 내가 읽는 방식은 T가 구문 분석 할 범위에 영향을 미칠 것입니다. 내가 잘못 읽고 있니? –