"text {<>}"과 같은 구조를 구문 분석 할 수있었습니다. 성령의 문서 내용은 비슷합니다. AST보기. 이boost :: spirit의 재귀 구조 구문 분석
<tag1>text1<tag2>text2</tag1></tag2>
같은 코드가 작동 문자열을 구문 분석이
<tag<tag>some_text>
같은 문자열을 구문 분석을 위해
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))
;
를이 코드는 작동하지 :
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을 구문 분석해서는 안된다는 사실을 알았습니다. 나는 성령으로 많은 파서를 썼다. 아마 그들은 비슷했다. 그러나 "무슨 일이 일어 났는지"는 언급하는 것을 잊었습니다 (그래서 우리는 "왜 그런 일이 일어 났는지"를 말할 수 없습니다). 그리고 당신은 또한 당신이 달성하고자하는 것을 말하는 것을 잊었습니다. 그래서 아는 사람들은 비슷한 파서가 있습니다 ... – sehe
나는 텍스트 규칙을 잊어 버릴 것입니다. 두 번째 경우 (작동 중)에는 "text = lexeme [+ (char_ - '<' - '>') [_val + = _1]];" – crastinus