私はこれを単純に解析し、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{
}
}
(他のグループ内のグループではなく、同じスコープ内の 2 つのグループ) パーサーが失敗します。理由がわかりません。