我解析語法使用助推精神和所有複雜的部分工作很好;然而,我試圖接受數字變量,我似乎無法讓他們正確解析。我不想對數字做任何事情,除了將它們存儲爲字符串,但我似乎無法得到匹配通用數字的字符串解析器。解析數字與助力氣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
第二種方法表現如預期,但簡單地使小數部分可選變化的結果排除小數點後面的數字。
任何幫助表示讚賞。
編輯:想要做到這一點的原因是,我正在解析一個語法來翻譯成稍微不同的語法。顯然,這兩個數字都是一樣的,所以我不在乎數字是什麼,只是它的格式良好。
祝賀你寫了一篇寫得很好的第一個問題。如果只有每個人都會努力提供正確的細節並提出明確的問題。 – Casey
另一種可能的選擇可能是:'qi :: raw [qi :: double_]'(也許'qi :: as_string [qi :: raw [qi :: double _]]')。這匹配一個double,忽略它的屬性,並且從double的開始到結尾「返回」一個迭代器範圍。這個範圍被轉換(隱式或顯式地取決於你使用哪個)到一個字符串。 – llonesmiz
爲什麼要將數字解析爲字符串?我強烈建議'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