Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 益气解数_C++_Parsing_Boost_Boost Spirit_Boost Spirit Qi - Fatal编程技术网

C++ 益气解数

C++ 益气解数,c++,parsing,boost,boost-spirit,boost-spirit-qi,C++,Parsing,Boost,Boost Spirit,Boost Spirit Qi,我正在使用boost spirit解析语法,所有复杂的部分都工作得很好;然而,我试图接受数值变量,但似乎无法正确解析它们。除了将数字存储为字符串之外,我不想对它们做任何事情,但我似乎无法让一个匹配通用数字的字符串解析器工作 下面是显示问题的代码: #include <boost/spirit/include/qi.hpp> namespace qi = boost::spirit::qi; int main() { std::vector<std::string>

我正在使用boost spirit解析语法,所有复杂的部分都工作得很好;然而,我试图接受数值变量,但似乎无法正确解析它们。除了将数字存储为字符串之外,我不想对它们做任何事情,但我似乎无法让一个匹配通用数字的字符串解析器工作

下面是显示问题的代码:

#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;
}
第二种方法的行为与预期一样,但简单地将小数部分设置为可选会更改结果,以排除小数点后的数字

感谢您的帮助


EDIT:之所以要这样做,是因为我正在解析一种语法,以便将其翻译成稍微不同的语法。显然,两者对待数字是一样的,所以我不在乎数字是什么,只是它是格式良好的

您的boost spirit版本可能有问题?以下是我对您的程序的输出:

$ ./a.exe
test0a: 25.16
test0b: 25.16
test1a: 2516
test1b: failed
这是我所期望的结果


祝贺你的第一个问题写得很好。如果每个人都能努力给出正确的细节并提出明确的问题,那么另一个可能的选择就是:
qi::raw[qi::double.]
(可能是
qi::as_string[qi::raw[qi::double.]
)。这将匹配double,忽略其属性,并“返回”从double开始到结束的迭代器范围。此范围已转换为字符串(隐式或显式,具体取决于您使用的范围)。为什么要将数字解析为字符串?我强烈建议
qi::raw[qi::lexeme[+qi::digit>>-('.>+qi::digit)]
-注意
lexeme
(!!!)的使用,或者@cv\u和@cv\u和\u-he(参见)建议的
qi::double\code>解析器,这是解决我的问题的一个很好的方法,这似乎很可能是boost 1.46.1中的精神问题。如果你愿意回答,我会接受的。@Casey谢谢!我已经阅读了足够多的问题和答案来理解如何得到你想要的答案。你可能是对的。我使用的是Boost1.46.1、GCC4.6.3和c++98。我为GCC4.6和c++98配置了在线编译器,但没有找到使用旧版本boost的方法(它使用的是1.55)。我会尝试更新,看看是否可以修复它。
$ ./a.exe
test0a: 25.16
test0b: 25.16
test1a: 2516
test1b: failed