code: func ParseBasic(s string) map[string]*BasicNode {
  	lines := strings.Split(s, "\n")
  	nodes := make(map[string]*BasicNode)
  	for _, line := range lines {
  		var edgeName string
  		if idx := strings.Index(line, ";"); idx >= 0 {
  			edgeName = strings.Trim(line[idx+1:], " \t\r\n")
  			line = line[:idx]
  		}
  		parts := strings.SplitN(line, "->", 2)
  		if len(parts) != 2 {
  			continue
  		}
  		head_name := strings.Trim(parts[0], " \t\r\n")
  		tail_name := strings.Trim(parts[1], " \t\r\n")
  		head := nodes[head_name]
  		if head == nil {
  			head = &BasicNode{Name: head_name}
  			nodes[head_name] = head
  		}
  		tail := nodes[tail_name]
  		if tail == nil {
  			tail = &BasicNode{Name: tail_name}
  			nodes[tail_name] = tail
  		}
  		edge := &BasicEdge{
  			Name:     edgeName,
  			EdgeHead: head,
  			EdgeTail: tail,
  		}
  		head.AddEdge(edge)
  	}
  	return nodes
  }
docs: // ParseBasic is used to parse a string in the format of:
  // a -> b ; edge name
  // b -> c
  // Into a series of basic node and basic edges