2013-11-26 2 views
2

나는 부스트 스피릿을 사용하여 문법을 파싱하고 있으며 모든 복잡한 부분은 훌륭하게 작동합니다. 그러나, 나는 숫자 변수를 받아들이려고 노력하고있어, 제대로 파싱 할 수없는 것 같습니다. 문자열로 저장하는 것을 제외하고는 숫자로 아무것도하고 싶지는 않지만 일할 일반 숫자와 일치하는 문자열 파서를 얻을 수없는 것 같습니다. 여기boost spirit qi로 구문 분석 번호

문제 보여준다 코드 :

#include <boost/spirit/include/qi.hpp> 
namespace qi = boost::spirit::qi; 

int main() 
{ 
    std::vector<std::string> testVec; 
    testVec.push_back("25.16"); 
    testVec.push_back("2516"); 
    std::string result; 
    std::string::const_iterator it, endIt; 

    for (unsigned int i = 0; i < testVec.size(); ++i) 
    { 
     it = testVec[i].begin(); 
     endIt = testVec[i].end(); 
     result.clear(); 

     std::cout << "test" << i << "a: "; 
     bool r = qi::phrase_parse(
      it, 
      endIt, 
      +qi::digit >> -(qi::string(".") >> +qi::digit), 
      qi::space, 
      result 
     ); 

     if (!r || it != endIt) 
     { 
      std::cout << "failed" << std::endl; 
     } 
     else 
     { 
      std::cout << result << std::endl; 
     } 

     it = testVec[i].begin(); 
     endIt = testVec[i].end(); 
     result.clear(); 

     std::cout << "test" << i << "b: "; 
     r = qi::phrase_parse(
      it, 
      endIt, 
      +qi::digit >> (qi::string(".") >> +qi::digit), 
      qi::space, 
      result 
     ); 

     if (!r || it != endIt) 
     { 
      std::cout << "failed" << std::endl; 
     } 
     else 
     { 
      std::cout << result << std::endl; 
     } 
    } 

    return 0; 
} 

을 그리고 출력은 다음과 같습니다

test0a: 25. 
test0b: 25.16 
test1a: 2516 
test1b: failed 

두 번째 방법은 예상대로 행동하지만, 단순히 소수 부분 옵션 변경을 배제하는 결과를 만들고있다 소수점 이하의 수치.

도움을 주시면 감사하겠습니다.

편집 :이 작업을 수행하려는 이유는 하나의 문법을 구문 분석하여 약간 다른 문법으로 변환하기 때문입니다. 분명히, 둘 다 숫자를 같게 처리하므로 번호가 무엇인지 상관하지 않습니다. 단지 그것이 잘 형성되어 있다는 것입니다.

+0

축하드립니다. 모든 사람 만이 정확한 세부 사항을 제시하고 분명한 질문을하기 위해 노력할 것입니다. – Casey

+0

또 다른 가능한 대안은'qi :: raw [qi :: double_]'(아마도'qi :: as_string [qi :: raw [qi :: double _]]') 일 수 있습니다. 이것은 double과 일치하고, 속성을 무시하고, double의 처음부터 끝까지 반복자 범위를 "반환"합니다. 이 범위는 문자열에 대해 (사용하는 것에 따라 암시 적으로 또는 명시 적으로) 변환됩니다. – llonesmiz

+0

숫자를 문자열로 파싱하는 이유는 무엇입니까? qi :: raw [qi :: lexeme [+ qi :: digit >> - ('.'>> + qi :: digit)]]''lexeme'의 사용에주의하십시오 *** (!!!) *** 또는 실제로 @cv_and_he가 제안한'qi :: double_' 파서 (** [Live on Coliru] (http://coliru.stacked-crooked.com/a/3d173afd62f2ad74)를 참조하십시오.) **) – sehe

답변

3

부력 정신 버전에 문제가 있습니까? 귀하의 프로그램에 대한 내 결과는 다음과 같습니다.

$ ./a.exe 
test0a: 25.16 
test0b: 25.16 
test1a: 2516 
test1b: failed 

결과는 예상대로입니다. 아주 잘 작성된 첫 번째 질문에

그리고 here is an online compile/run of your code

+0

당신이 옳을 수도 있습니다. 나는 boost 1.46.1, gcc 4.6.3, 그리고 C++ 98을 사용하고있다. gcc 4.6 및 C++ 98 용 온라인 컴파일러를 구성했지만 이전 부스트 (1.55 사용)를 사용할 방법을 찾지 못했습니다. 나는 그것이 고칠 수 있는지를 갱신하고 보려고 노력할 것이다. – rctaylor

관련 문제