【问题标题】:boost::spirit and grammarsboost::spirit 和语法
【发布时间】:2013-02-19 20:15:32
【问题描述】:

我正在尝试简单地解析这个并使用 Boost::Spirit 简化基于 xml 的结构,

One{
    Two{
        Three{
        }
    }
}

并且代码组织如下:

结构定义以保留精神材料:

struct config;
typedef boost::variant< boost::recursive_wrapper<config> , std::string > config_node;

struct config
{
    std::string name;
    std::vector<config_node> children; 
};


BOOST_FUSION_ADAPT_STRUCT(
    config,
    (std::string, name)
    (std::vector<config_node>, children)
)

(无耻地从xml介绍中窃取)

规则声明(在解析器类上)

qi::rule<Iterator, config(), qi::locals<std::string>, ascii::space_type> cfg;
qi::rule<Iterator, config_node(), ascii::space_type> node;
qi::rule<Iterator, std::string(), ascii::space_type> start_tag;
qi::rule<Iterator, void(std::string), ascii::space_type> end_tag;

在解析器'parse'方法中定义规则。

    node = cfg;
    start_tag =  +(char_ -'{') >> '{';
    end_tag = char_('}');

    cfg %=  start_tag[_a = _1]
        >>  *node
        >>  end_tag(_a);

_a 和 _1 是 boost::phoenix 变量。

此规则适用于上面粘贴的小片段,但如果我将其更改为:

One{
    Two{
    }
    Three{
    }
}

(同一范围内的两个组,而不是其他组内的组)解析器失败。 我不知道为什么。

【问题讨论】:

    标签: c++ boost boost-spirit boost-spirit-qi


    【解决方案1】:

    为了将来参考,您的代码似乎是 Boost 教程中 mini_xml2.cpp 的简化版本(又名“无耻被盗”)。

    要使您的示例正常工作,您必须更改行:

    start_tag =  +(char_ -'{') >> '{';
    

    start_tag = +(char_ -'{' - '}') &gt;&gt; '{';

    现在非常不言自明:) 每当解析器解析start_tag 时,它就会开始寻找nodes(因为&gt;&gt; *node 部分)。由于} 是合法的start_tag,它可能被识别为一个,它不应该。


    顺便说一句,您可能会考虑修复您的代码中的一些冗余。例如:

    在最初的 mini_xml2.cpp 示例中,end_tag 用作检查您关闭与打开的标签相同的标签的函数(因此签名 void(std::string))。你会更好

    cfg %=  start_tag[_a = _1]
    >> *node
    >> "}";
    

    mini_xml2.cpp 示例中的节点是多态的,因此boost::variant 与访问者一起使用。在您的示例中,这也是多余的。老实说,这让我想知道这条线是怎么回事

    node = cfg
    

    在编译过程中没有引起任何问题,因为node 有一个boost::variant 类型。仅供参考,在原始示例中,这一行是:

    node %= xml | text;
    

    并且%= 运算符正确地“猜测”了 RHS 的类型,因为 | 运算符将结果读取为 boost::variant

    【讨论】:

    • 谢谢。提升是一个巨大的怪物,我m still trying to tame`它。 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2012-02-28
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多