/*
* JFLAP - Formal Languages and Automata Package
*
*
* Susan H. Rodger
* Computer Science Department
* Duke University
* August 27, 2009
* Copyright (c) 2002-2009
* All rights reserved.
* JFLAP is open source software. Please see the LICENSE for terms.
*
*/
package automata;
import java.util.Stack;
/**
* This class represents a configuration of an automaton for simulation of input
* on an automaton (i.e. the state the automaton is currently in, the
* unprocessed input, and the contents of the tapes/stack if applicable). A
* Configuration
object is simply a data structure that stores
* this information, and does not do any work of progressing this configuration
* to other configurations as a simulator would.
*
* @see automata.AutomatonSimulator
*
* @author Ryan Cavalcante
*/
public abstract class Configuration implements Cloneable {
/**
* Instantiates a new configuration.
*
* @param state
* the state the automaton is currently in.
*/
public Configuration(State state, Configuration parent) {
myCurrentState = state;
this.parent = parent;
}
/**
* Returns the state the automaton is currently occupying.
*
* @return the state the automaton is currently occupying.
*/
public State getCurrentState() {
return myCurrentState;
}
/**
* Sets current state.
*
* @param state
* the state the automaton is currently in.
*/
public void setCurrentState(State state) {
myCurrentState = state;
}
/**
* Returns a string representation of this object. The string returned is
* the string representation of the current state.
*
* @return a string representation of this object
*/
public String toString() {
return "[" + getCurrentState().toString() + "]";
}
/**
* Returns the "parent" for this configuration, that is, the configuration
* that led to this configuration.
*
* @see automata.AutomatonSimulator#stepConfiguration
* @return the Configuration
that led to this configuration,
* or null
if this is the initial configuration
*/
public Configuration getParent() {
return parent;
}
/**
* Returns if this configuration is an accepting configuration.
*
* @return true if this configuration is an accepting
* configuration, false
otherwise
*/
public abstract boolean isAccept();
/**
* The basic equals method considers two configurations equal if they both
* have the same state, and proceeded from the same configuration. By "the
* same configuration" it is meant a comparison of the parents via the ==
* operation rather than the .equals()
operation, since the
* latter would lead to rather lengthly traversions.
*
* @param configuration
* the configuration to test for equality
*/
public boolean equals(Object configuration) {
Configuration config = (Configuration) configuration;
if (parent != config.parent)
return false;
return config.myCurrentState == myCurrentState;
}
/**
* Returns the base hash code for a configuration. Subclasses should
* override so as not to have all configurations with the same parent
* configuration and state map to the same hash entry.
*
* @return a value for hashing
*/
public int hashCode() {
return myCurrentState.hashCode()
^ (parent == null ? 0 : parent.primitiveHashCode());
}
/**
* Returns the "primitive" hash code of the superclass, which is the generic
* hash code of the object.
*/
private int primitiveHashCode() {
return super.hashCode();
}
/**
* Returns whether we are focussed on a block or at the top automaton
* @return true
if focused on a block
*/
public boolean getFocused() {
return focused;
}
/**
* Sets whether we are focused or not.
* @param focus true
if focused, false if not
*/
public void setFocused(boolean focus) {
focused = focus;
}
// /**
// * Gets the stack of parent automatons (arranged in a hierarchy, top level of the stack
// * is the immediate parent automaton)
// * @return the stack of automatons
// */
// public Stack getAutoStack() {
// return parentAutos;
// }
//
// /**
// * Sets the stack of parent automatons
// * @param parentAutos the stack of parents
// */
// public void setAutoStack(Stack autos) {
// parentAutos = autos;
// }
//
// /**
// * Get the stack of blocks
// * TODO: What is this?
// * @return
// */
// public Stack getBlockStack() {
// return parentBlocks;
// }
//
// /**
// * @param parentAutos
// */
// public void setBlockStack(Stack blocks) {
// parentBlocks = blocks;
// }
/**
* Resets to be unfocused.
*
*/
public void reset() {
this.setFocused(false);
}
// /** The stack of parent automatons - top of the stack is closest parent*/
// private Stack parentAutos = new Stack();
/** True if focused in on a block, false otherwise. */
private boolean focused = false;
/** The state the automaton is currently in. */
private State myCurrentState;
/** The parent for this configuration. */
private Configuration parent;
}