【问题标题】:Parsing nested data in boost-spirit在 boost-spirit 中解析嵌套数据
【发布时间】:2011-06-03 15:04:48
【问题描述】:

我需要解析一些文本树:

std::string data = "<delimiter>field1a fieald1b fieald1c<delimiter1>subfield11<delimiter1>subfieald12<delimiter1>subfieald13 ... <delimiter>field2a fieald2b fieald2c<delimiter1>subfield21<delimiter1>subfieald22<delimiter1>subfieald23 ..."

&lt;delimiter&gt;,&lt;delimiter1&gt; 是 std::string 的一部分,而不是单个字符

可以用 boost::spirit 标记这个字符串吗?

【问题讨论】:

    标签: c++ boost-spirit


    【解决方案1】:

    列表解析器是你的朋友:

    namespace qi = boost::spirit::qi;
    
    // tokenize on '<delimiter1>' and return the vector
    rule<std::string::iterator, qi::space_type, std::vector<std::string>()> fields =
        *(char_ - "<delimiter1>") % "<delimiter1>";
    
    std::string data("<delimiter>field1a fieald1b ...");
    std::vector<std::vector<std::string> > fields_data;
    
    // tokenize of '<delimiter>' and return a vector of vectors
    qi::phrase_parse(data.begin(), data.end(), 
        fields % "<delimiter>", qi::space, fields_data);
    

    您可能需要最新版本的 Spirit 才能正常工作(Boost V1.47 或 SVN 主干)。

    【讨论】:

    • 非常感谢!我实现了您的代码,它的编译没有任何错误,但在解析时忽略了 lexeme ''。我使用电流稳定提升(1.46.1)。当我在 1.47 上测试时,我会写出来。
    【解决方案2】:

    是的,您可以使用精神来执行此格式,但在我看来,这比您需要的要多得多。

    我会直接使用 std 字符串函数自己编写标记化代码。或者 boost:regex 应该很容易为你做到这一点。

    【讨论】:

    • 随着您的需求的发展,手写解析器很快就变成了一堆无法维护的意大利面条代码。从有原则的起点开始会更好。
    • 但是他的规范非常简单——真正的分词器比解析器更能描述他的需求
    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    相关资源
    最近更新 更多