Я выиграл, чтобы разобрать структуру как «текст {<>}». Содержание документации для духа похоже на пример AST. Для разбора строки, как этотАнализ рекурсивной структуры на boost :: spirit
<tag1>text1<tag2>text2</tag1></tag2>
этот код работает:
templ = (tree | text) [_val = _1];
start_tag = '<'
>> !lit('/')
>> lexeme[+(char_- '>') [_val += _1]]
>>'>';
end_tag = "</"
>> string(_r1)
>> '>';
tree = start_tag [at_c<1>(_val) = _1]
>> *templ [push_back(at_c<0>(_val), _1) ]
>> end_tag(at_c<1>(_val))
;
Для разбора строки, как этот
<tag<tag>some_text>
Этот код не работает:
templ = (tree | text) [_val = _1];
tree = '<'
>> *templ [push_back(at_c<0>(_val), _1) ]
>> '>'
;
Templ является паритет с внутренней рекурсивной структурой:
namespace client {
struct tmp;
typedef boost::variant <
boost::recursive_wrapper<tmp>,
std::string
> tmp_node;
struct tmp {
std::vector<tmp_node> content;
std::string text;
};
}
BOOST_FUSION_ADAPT_STRUCT(
tmp_view::tmp,
(std::vector<tmp_view::tmp_node>, content)
(std::string,text)
)
Кто может объяснить, почему это произошло? Может быть, кто знает похожие парсеры, пишет об boost :: spirit?
В чем вопрос? Я вижу два недопустимых фрагмента XML и две относительно несвязанные грамматики, которые, очевидно, не должны анализировать недопустимый XML. Я написал много парсеров в Духе. Возможно, они были похожи. Но вы забыли упомянуть «что случилось» (поэтому мы не можем сказать «почему это случилось»), и вы также забыли сказать, чего вы пытаетесь достичь. Так что _who знает_ есть похожие парсеры ... – sehe
Я забуду текстовое правило. Во втором случае (рабочий) он должен быть «text = lexeme [+ (char_ - '<' - '>') [_val + = _1]];" – crastinus