用提升精神解析数字

时间:2013-11-26 22:03:05

标签: c++ parsing boost boost-spirit 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

第二种方法是按预期运行,但只是使小数部分可选更改结果以排除小数点后的数字。

感谢任何帮助。

编辑:想要这样做的原因是我正在解析一个语法以转换成稍微不同的语法。显然,两者都对数字相同,所以我不在乎数字是多少,只是它形成得很好。

1 个答案:

答案 0 :(得分:3)

你的助推精神版可能有问题吗?这是我的程序输出:

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

这是我期望的结果。

here is an online compile/run of your code