public abstract class AToken {
    /**
    * The _lexeme this token is representing.
    */
    private String _lexeme;

    /**
    * Token constructor.
    *
    * @param lexeme _lexeme this token is representing.
    */
    public AToken(String lexeme) {
	_lexeme = lexeme;
    }


    /**
    * Execute a token visitor.
    *
    * @param algo visitor to execute
    * @param param visitor-specific parameter
    * @return visitor-specific return value
    */
    public abstract Object execute(ITokVisitor algo, Object param);

    /**
    * Return a string representation of the token.
    *
    * @return string representation
    */
    public String toString() {
	return _lexeme;
    }
}
public interface ITokVisitor {
    /**
    * Default case for a token.
    *
    * @param host token
    * @param param visitor-specific parameter
    * @return visitor-specific return value
    */
    public Object defaultCase(AToken host, Object param);
}
public class NumToken extends AToken {
    /**
    * Interface for a visitor to visit a number token.
    */
    public static interface INumVisitor extends ITokVisitor {
    /**
    * Case for a number token.
    *
    * @param host number token
    * @param param visitor-specific parameter
    * @return visitor-specific return value
    */
    	public Object numCase(NumToken host, Object param);
    }

    /**
    * Abstract class for a chained visitor to visit a number token. 
    * In all non-plus cases, the successor is called.
    */
    public static abstract class AChainVis implements INumVisitor {
        /**
    	* Successor.
    	*/
	private ITokVisitor _successor;

    	/**
    	* Constructor.
    	*
    	* @param successor visitor to serve as successor in the chain of responsibility.
    	*/
	protected AChainVis(ITokVisitor successor) {
	    _successor = successor;
    	}

	/**
	* Continue in the chain of responsibility.
	*
	* @param host token
	* @param param visitor-specific parameter
	* @return visitor-specific return value
	*/
	public Object defaultCase(AToken host, Object param) {
	    return host.execute(_successor, param);
	}
    }

    /**
    * Constructor for a number token.
    *
    * @param lexeme number lexeme
    */
    public NumToken(String lexeme) {
	super(lexeme);
    }

    /**
    * Execute the number case of the visitor.
    *
    * @param algo visitor
    * @param param visitor-specific parameter
    * @return visitor-specific return value
    */
    public Object execute(ITokVisitor algo, Object param) {
	return (algo instanceof INumVisitor) ?
	    ((INumVisitor) algo).numCase(this, param) :
	    algo.defaultCase(this, param);
    }
}