2013-11-26 53 views
2

我解析語法使用助推精神和所有複雜的部分工作很好;然而,我試圖接受數字變量,我似乎無法讓他們正確解析。我不想對數字做任何事情,除了將它們存儲爲字符串,但我似乎無法得到匹配通用數字的字符串解析器。解析數字與助力氣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