我正在使用提升精神解析语法,所有复杂的部分都运行良好;但是,我正在尝试接受数字变量,我似乎无法让它们正确解析。我不想对数字做任何事情,除了将它们存储为字符串,但我似乎无法获得与通用数字相匹配的字符串解析器。
以下是显示问题的代码:
#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 :(得分:3)
你的助推精神版可能有问题吗?这是我的程序输出:
$ ./a.exe
test0a: 25.16
test0b: 25.16
test1a: 2516
test1b: failed
这是我期望的结果。