code: package edu.berkeley.nlp.io;
  
  /**
   * Something that implements the <code>Label</code> interface can act as a
   * constituent, node, or word label with linguistic attributes. A
   * <code>Label</code> is required to have a "primary" <code>String</code>
   * <code>value()</code> (although this may be null). This is referred to as its
   * <code>value</code>.
   * <p>
   * Implementations of Label split into two groups with respect to equality.
   * Classes that extend ValueLabel define equality solely in terms of String
   * equality of its value (secondary facets may be present but are ignored for
   * purposes of equality), and have equals and compareTo defined across all
   * subclasses of ValueLabel. This behavior should not be changed. Other classes
   * that implement Label define equality only with their own type and require all
   * fields of the type to be equal.
   * <p>
   * A subclass that extends another Label class <i>should</i> override the
   * definition of <code>labelFactory()</code>, since the contract for this method
   * is that it should return a factory for labels of the exact same object type.
   * 
   * @author Christopher Manning
   */
  public interface Label {
  
  	/**
  	 * Return a String representation of just the "main" value of this label.
  	 * 
  	 * @return the "value" of the label
  	 */
  	public String value();
  
  	/**
  	 * Set the value for the label (if one is stored).
  	 * 
  	 * @param value
  	 *            - the value for the label
  	 */
  	public void setValue(String value);
  
  	/**
  	 * Return a String representation of the label. For a multipart label, this
  	 * will return all parts. The <code>toString()</code> method causes a label
  	 * to spill its guts. It should always return an empty string rather than
  	 * <code>null</code> if there is no value.
  	 * 
  	 * @return a text representation of the full label contents
  	 */
  	public String toString();
  
  	/**
  	 * Set the contents of this label to this <code>String</code> representing
  	 * the complete contents of the label. A class implementing label may throw
  	 * an <code>UnsupportedOperationException</code> for this method (only).
  	 * Typically, this method would do some appropriate decoding of the string
  	 * in a way that sets multiple fields in an inverse of the
  	 * <code>toString()</code> method.
  	 * 
  	 * @param labelStr
  	 *            the String that translates into the content of the label
  	 */
  	public void setFromString(String labelStr);
  
  	/**
  	 * Returns a factory that makes labels of the exact same type as this one.
  	 * May return <code>null</code> if no appropriate factory is known.
  	 * 
  	 * @return the LabelFactory for this kind of label
  	 */
  	public LabelFactory labelFactory();
  
  }
  