code: function tag() {
  		var m = match(/^<([\w-:.]+)\s*/);
  		if (!m) return;
  
  		// name
  		var node = {
  			name: m[1],
  			attributes: {},
  			children: [],
  		};
  
  		// attributes
  		while (!(eos() || is('>') || is('?>') || is('/>'))) {
  			var attr = attribute();
  			if (!attr) return node;
  			node.attributes[attr.name] = attr.value;
  		}
  
  		// self closing tag
  		if (match(/^\s*\/>\s*/)) {
  			return node;
  		}
  
  		match(/\??>\s*/);
  
  		// content
  		node.content = content();
  
  		// children
  		var child;
  		while ((child = tag())) {
  			node.children.push(child);
  		}
  
  		// closing
  		match(/^<\/[\w-:.]+>\s*/);
  
  		return node;
  	}
docs: Tag.