使用boost spirit x3将数字解析为字符串

时间:2016-07-24 12:48:50

标签: c++ parsing c++14 boost-spirit boost-spirit-x3

我想用精神x3将各种数字解析成一个字符串。我试着这样做,但它不起作用。

typedef x3::rule<class int_parser_id, std::string> int_parser_type;
const int_parser_type int_parser = "int_parser";
auto const int_parser_def = x3::int32;

我可以做什么来将使用x3 :: int32解析器的Int解析为字符串?

1 个答案:

答案 0 :(得分:1)

解析是扫描字符串以生成具体类型或类型集合的对象;你所要求的是与之相反的,精神称之为“一代”。 Spirit.X3仅执行解析,因此您直接问题的答案是:您不能。

然而,Spirit确实附带了一个单独的组件:Spirit.Karma

#include <ctime>
#include <iostream>
#include <Eigen/Dense>

int main(int argc, char* argv[])
{
    const Eigen::ArrayXd xs(Eigen::ArrayXd::Random(1000000));
    Eigen::ArrayXd array_result(Eigen::ArrayXd::Zero(xs.size())), loop_result(Eigen::ArrayXd::Zero(xs.size()));

    {
        std::clock_t start_time = std::clock();
        for (int i = 1; i <= 100; ++i) {
            const double b = i; // Values not important;
            array_result += exp(b * xs);
        }
        std::clock_t end_time = std::clock();
        std::cout << "Array time (seconds): " << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC << std::endl;
    }

    {
        std::clock_t start_time = std::clock();
        for (int i = 1; i <= 100; ++i) {
            const double b = i; // Values not important;
            for (Eigen::ArrayXd::Index i = 0; i < xs.size(); ++i) {
                loop_result[i] += exp(b * xs[i]);
            }
        }
        std::clock_t end_time = std::clock();
        std::cout << "Loop time (seconds): " << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC << std::endl;
    }

    system("pause");
    return 0;
}

Online Demo

必须注意的是,Karma是一个C ++ 03代码库,因此编译时间比X3长得多 - 强烈建议使用预编译头文件!