我赢得解析“text {<>}”之类的结构。例如,Spirit文档内容类似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是平价用recursive_wrapper里面唱结构:
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。我用Spirit编写了很多解析器。也许他们是相似的。但是你忘了提及“发生了什么”(所以我们不能说“为什么会发生”),而且你也忘了说你想要达到的目标。所以_who知道_有类似的解析器... – sehe
我会忘记一个文本规则。在第二种情况下(工作)它必须是“text = lexeme [+(char_ - '<' - '>')[_val + = _1]];” – crastinus