2013-03-22 4 views
2

다음 파서가 test을 구문 분석하지 못하는 이유를 이해하는 데 어려움이 있습니다. qi::phrase_parse에 대한 호출 후 는 resultit2 포인트 문자열의 끝에서 사실이지만, mynr는 여전히 0 :Boost.Spirit 파서가 일치하지 않습니다

std::string test = "#define SOMEMACRO 8.0"; 
    auto it2 = test.begin(); 
    auto endIt2 = test.end(); 
    double mynr = 0; 
    bool result = 
    qi::phrase_parse(
     it2, 
     endIt2, 
     ("#define" >> (*qi::alnum) >> qi::double_[ref(mynr) = qi::_1]), 
     qi::space); 

내가 의심하고는 qi::alnum과 공간을 건너 뛰는 함께 할 수있는 뭔가가.

개별 구성 요소로 사례를 축소하려고했습니다. 나는 별도로 세 파서를 확인하고 발견 :

  • "#DEFINE는"실제로
  • (*qi::alnum)SOMEMACRO
  • qi::double_ 소비 할 수있는 소비 할 수있다 "#DEFINE를"소비 8.0

별도로, 각 구문 분석기는 이상하게 작동하지만 이상하게 작동합니다. 더 작은 시험은 내가 (*qi::alnum)을 사용할 때 사용하는 것처럼 보였습니다. 단지 SOMEMACRO 이상을 소비하는 것으로 보이지만 나머지 문자열 또한 사용합니다.

답변

2

업데이트로 인해 실제로 무슨 일이 벌어지고 있는지 깨닫게되었습니다. 그리고 당신 말이 맞아요, *alnum은 당신이 원하는 것 이상을 먹고 있습니다.

("#define" >> lexeme[*qi::alnum] >> (qi::double_)[boost::phoenix::ref(mynr) = boost::spirit::_1]) 

이것은 작동합니다.

*alnum은 영숫자를 사용하며 그 사이의 공백을 건너 뜁니다. 그래서 실제로는 SOMEMACRO 8을 먹었습니다. 그렇다면 마지막에 8.0을 먹을 때 효과가 있다고 제안했을 때, 이중 파서가 .0을 소비했기 때문입니다.

상단의 새 파서는 *alnum의 중간에 공백이 없어야합니다.

다음 문법에 대해 유의해야 할 새로운 것들이다 :

  1. 나는 이중의 값을 저장하는 의미 조치를 포함 시켰습니다. mynr이라는 이중으로 저장합니다.
  2. lexeme*alnum을 입력했습니다. 이로 인해 파서는 내부에있는 동안 문자를 건너 뛰지 않습니다. 이 올바른 문법으로
  3. , 그것은 "#define SOMEMACRO 8.0""#define SOMEMACRO 8"
+0

나는 그것을 시도를 구문 분석 할 수있어 대신 8.0를 가진 때 실제로 전체 문자열을 소비 않습니다. 그러나 나는 그것이 기대하고있는 것처럼 그것을 파싱한다고 생각하지 않는다. 내 조사 결과를 바탕으로 내 질문을 업데이트했습니다. –

+0

시맨틱 액션은 다음과 같아야합니다 :'[boost :: phoenix :: ref (mynr) = boost :: spirit :: _ 1]'. –

+0

덕분에 여전히 그래도 작동하지 않습니다. 'mynr'은 여전히 ​​0 –