【发布时间】:2013-12-12 16:03:47
【问题描述】:
我赢了解析像“text { }”这样的结构。 Spirit 文档内容类似AST 示例。 像这样解析字符串
<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 sn-ps,以及两个相对不相关的语法,它们显然都不应该解析无效的 XML。我在 Spirit 中编写了很多解析器。也许他们很相似。但是你忘了提到“发生了什么”(所以我们不能说“为什么会发生”),你也忘了说你想要实现的目标。所以谁知道有类似的解析器...
-
我会忘记文本规则。在第二种情况下(工作)它必须是 "text = lexeme[+(char_ - '') [_val += _1]];"
标签: c++ parsing boost-spirit boost-spirit-qi