我贏得解析「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