private Node composeNode(Node parent) {
   recursiveNodes.add(parent);
   if (parser.checkEvent(Event.ID.Alias)) {
     AliasEvent event = (AliasEvent) parser.getEvent();
     String anchor = event.getAnchor();
     if (!anchors.containsKey(anchor)) {
       throw new ComposerException(
           null, null, "found undefined alias " + anchor, event.getStartMark());
     }
     Node result = anchors.get(anchor);
     if (recursiveNodes.remove(result)) {
       result.setTwoStepsConstruction(true);
     }
     return result;
   }
   NodeEvent event = (NodeEvent) parser.peekEvent();
   String anchor = null;
   anchor = event.getAnchor();
   // the check for duplicate anchors has been removed (issue 174)
   Node node = null;
   if (parser.checkEvent(Event.ID.Scalar)) {
     node = composeScalarNode(anchor);
   } else if (parser.checkEvent(Event.ID.SequenceStart)) {
     node = composeSequenceNode(anchor);
   } else {
     node = composeMappingNode(anchor);
   }
   recursiveNodes.remove(parent);
   return node;
 }
 protected void composeMappingChildren(List<NodeTuple> children, MappingNode node) {
   Node itemKey = composeKeyNode(node);
   if (itemKey.getTag().equals(Tag.MERGE)) {
     node.setMerged(true);
   }
   Node itemValue = composeValueNode(node);
   children.add(new NodeTuple(itemKey, itemValue));
 }
 /**
  * Reads a document from a source that contains only one document.
  *
  * <p>If the stream contains more than one document an exception is thrown.
  *
  * @return The root node of the document or <code>null</code> if no document is available.
  */
 public Node getSingleNode() {
   // Drop the STREAM-START event.
   parser.getEvent();
   // Compose a document if the stream is not empty.
   Node document = null;
   if (!parser.checkEvent(Event.ID.StreamEnd)) {
     document = composeDocument();
   }
   // Ensure that the stream contains no more documents.
   if (!parser.checkEvent(Event.ID.StreamEnd)) {
     Event event = parser.getEvent();
     throw new ComposerException(
         "expected a single document in the stream",
         document.getStartMark(),
         "but found another document",
         event.getStartMark());
   }
   // Drop the STREAM-END event.
   parser.getEvent();
   return document;
 }