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);
}
}