def parseFamily(elem) :
		assert elem.tagName == "family"
		return {
			"category" : "family",
			"typename" : lib.textValue(lib.selectChild(elem, "typename")),
			"members" : map(lib.textValue, lib.selectChildren(lib.selectChild(elem, "members"), "typename"))
		}
		def parseEntry(entryElem) :
			child = {
				"count" : lib.textValue(lib.selectChild(entryElem, "count")),
				"typename" : lib.textValue(lib.selectChild(entryElem, "typename"))
			}
			if len(lib.selectChildren(entryElem, "label")) > 0 :
				child["label"] = lib.textValue(lib.selectChild(entryElem, "label"))
			return child
	def parseTree(elem) :
		def parseEntry(entryElem) :
			child = {
				"count" : lib.textValue(lib.selectChild(entryElem, "count")),
				"typename" : lib.textValue(lib.selectChild(entryElem, "typename"))
			}
			if len(lib.selectChildren(entryElem, "label")) > 0 :
				child["label"] = lib.textValue(lib.selectChild(entryElem, "label"))
			return child
		assert elem.tagName == "tree"
		return {
			"category" : "tree",
			"typename" : lib.textValue(lib.selectChild(elem, "typename")),
			"layout" : map(parseEntry, lib.selectChildren(elem, "entry"))
		}
	def parseTerminal(elem) :
		assert elem.tagName == "terminal"
		return {
			"category" : "terminal",
			"typename" : lib.textValue(lib.selectChild(elem, "typename"))
		}