List * tag_list() { List * list = NULL; if( match( STAG ) ) { list = make_list( yylval ); //匹配到开始标签 advance(); add_child( list, tag_list() ); //添加孩子 if( strcmp( yylval->tag_name, list->node->tag_name ) != 0 ) //处理标签不匹配问题 { printf( "发生标签不匹配问题,在.xml文件中%d行的%s标签与在%d行%s标签不匹配!\n", yylval->lineno, yylval->tag_name, list->node->lineno, list->node->tag_name ); exit( 0 ); } advance(); add_list( list, tag_list() ); //添加同级标签 } else if( match( TEXT ) ) { list = make_list( yylval ); advance(); add_list( list, tag_list() ); } else if( match( ETAG ) ) //匹配到结束标签 直接返回空 ; return list; }
tag_list from_string(std::string const &p_string) { GstTagList *tag_list_ = gst_tag_list_new_from_string(p_string.c_str()); if (tag_list_ == nullptr) return tag_list(); else return tag_list(tag_list_); }
int main() { List * root; /*定义语义树根结点*/ root = tag_list(); /*递归下降分析返回根结点*/ print_tree(0, root); /*打印树到屏幕*/ return 0; }
term_t heap_cons2(heap_t *hp, term_t head, term_t tail) { cons_t *cons; int gap = sizeof(*cons); cons = (cons_t *)heap_alloc(hp, gap); cons->head = head; cons->tail = tail; return tag_list(cons); }
void add_raw_value(tag_list &p_tag_list, GValue const *p_value, std::string const &p_name, GstTagMergeMode const p_merge_mode) { g_assert(p_value != NULL); g_assert(!p_name.empty()); if (p_tag_list.is_empty()) p_tag_list = tag_list(gst_tag_list_new_empty()); gst_tag_list_add_value(p_tag_list.get_tag_list(), p_merge_mode, p_name.c_str(), p_value); }