| State |

    1   /*
    2    *  State.java
    3    *
    4    *  Copyright (c) 1998-2001, The University of Sheffield.
    5    *
    6    *  This file is part of GATE (see http://gate.ac.uk/), and is free
    7    *  software, licenced under the GNU Library General Public License,
    8    *  Version 2, June 1991 (in the distribution as file licence.html,
    9    *  and also available at http://gate.ac.uk/gate/licence.html).
    10   *
    11   *  Valentin Tablan, 11/Apr/2000
    12   *
    13   *  $Id: State.java,v 1.35 2001/11/05 16:23:28 nasso Exp $
    14   */
    15
    16  package gate.fsm;
    17
    18  import java.util.*;
    19  import gate.jape.*;
    20  import gate.util.SimpleArraySet;
    21
    22  /**
    23   * This class implements a Finite State Machine state.
    24   *
    25   */
    26  public class State implements JapeConstants {
    27
    28    /** Debug flag
    29     */
    30    private static final boolean DEBUG = false;
    31
    32    /**
    33     * Build a new state.
    34     *
    35     * @param owner the FSM that owns this state.
    36     */
    37    public State() {
    38      myIndex = State.index++;
    39      isFinal = false;
    40    }
    41
    42    /**
    43     * Reports if this state is a final one.
    44     * Note: A state has an associated action if and only if it is final.
    45     */
    46    public boolean isFinal() {
    47      return isFinal;
    48    }
    49
    50    /**
    51     * Gets the set of transitions for this state.
    52     *
    53     * @return a Set contining objects of type gate.fsm.Transition
    54     */
    55  // >>> DAM, was Set
    56  /*
    57    public Set getTransitions() {
    58      return transitions;
    59    }
    60  */
    61  // >>> DAM, TransArray optimization
    62    public SimpleArraySet getTransitions() {
    63      return transitions;
    64    }
    65  // >>> DAM, end
    66    /** Sets the action associated to this FINAL state. An action is actually
    67     * a gate.jape.RightHandSide object.
    68     * NOTE: only a final state has an associated action so after a call to this
    69     * method this state will be a final one.
    70     */
    71    protected void setAction(RightHandSide rhs) {
    72      action = rhs;
    73      isFinal = (action != null);
    74    }
    75
    76    /** Sets the value for fileIndex. File index is the index in the jape
    77     * definition file of the rule that contains as right hand side the action
    78     * associated to this state. This value is only intended for final states.
    79     */
    80    protected void setFileIndex(int i) { fileIndex = i; }
    81
    82    /** Sets the value for priority. Priority is the priority in the jape
    83     * definition file of the rule that contains as right hand side the action
    84     * associated to this state. This value is only intended for final states.
    85     */
    86    protected void setPriority(int i) { priority = i; }
    87
    88    /**
    89     * Gets the action associated to this state.
    90     *
    91     * @return a RightHandSide object
    92     */
    93    public RightHandSide getAction() {
    94      return action;
    95    }
    96
    97    /**
    98     * Returns the index in the definition file of the rule that generated this
    99     * state.
    100    * The value for fileIndex is correct only on final states!
    101    */
    102   int getFileIndex() { return fileIndex; }
    103
    104   /**
    105    * Returns the priority in the definition file of the rule that generated
    106    * this state.
    107    * This value is correct only on final states!
    108    */
    109   int getPriority() { return priority; }
    110
    111   /**
    112    * Adds a new transition to the list of outgoing transitions for this state.
    113    *
    114    * @param transition the transition to be added
    115    */
    116   public void addTransition(Transition transition) {
    117     transitions.add(transition);
    118   } // addTransition
    119
    120   /**
    121    * Gets the index of this state. Each state has a unique index (a int value).
    122    * This value is not actually used by any of the algorithms. It is useful only
    123    * as a way of refering to states in string representations so it is used by
    124    * toString and GML related methods.
    125    *
    126    * @return the index associated to this state
    127    */
    128   protected int getIndex() {
    129     return myIndex;
    130   }// getIndex
    131
    132   /**
    133    * Returns a GML (graph modelling language) representation for the edges
    134    * corresponding to transitions departing from this state in the
    135    * transition graph of the FSM to which this state belongs
    136    *
    137    * @return a string value contining the GML text
    138    */
    139   public String getEdgesGML() {
    140 ///    String res = "";
    141     StringBuffer res = new StringBuffer(gate.Gate.STRINGBUFFER_SIZE);
    142
    143     Iterator transIter = transitions.iterator();
    144     BasicPatternElement bpe;
    145
    146     while(transIter.hasNext()) {
    147       Transition currentTrans = (Transition)transIter.next();
    148 /*      res += "edge [ source " + myIndex +
    149              " target " + currentTrans.getTarget().getIndex() +
    150              " label \"" + currentTrans.shortDesc() + ":";
    151 */
    152         res.append("edge [ source ");
    153         res.append(myIndex);
    154         res.append(" target ");
    155         res.append(currentTrans.getTarget().getIndex());
    156         res.append(" label \"");
    157         res.append(currentTrans.shortDesc());
    158         res.append(":");
    159
    160              bpe = currentTrans.getConstraints();
    161              if(bpe == null) ///res += "null";
    162                 res.append("null");
    163              else ///res += bpe.shortDesc();
    164                 res.append(bpe.shortDesc());
    165 ///             res += " :" + currentTrans.getBindings() +              "\" ]\n";
    166              res.append(" :");
    167              res.append(currentTrans.getBindings());
    168              res.append("\" ]\n");
    169     }
    170     return res.toString();
    171   } // getEdgesGML
    172
    173   /**
    174    * Returns a textual description of this state
    175    *
    176    * @return a String value.
    177    */
    178   public String toString() {
    179 ///    String res = "State " + myIndex;
    180     StringBuffer res = new StringBuffer(gate.Gate.STRINGBUFFER_SIZE);
    181
    182     if(isFinal()) ///res += "\nFinal!";
    183         res.append("\nFinal!");
    184
    185     ///res += "\nTransitions:\n";
    186     res.append("\nTransitions:\n");
    187
    188     Iterator transIter = transitions.iterator();
    189     while(transIter.hasNext()){
    190       ///res += transIter.next().toString();
    191       res.append(transIter.next().toString());
    192     }
    193     return res.toString();
    194   }
    195
    196
    197   /**
    198    * A set of objects of type gata.fsm.Transition representing the outgoing
    199    * transitions.
    200    */
    201 // >>> DAM was
    202 /*
    203   private Set transitions = new HashSet();
    204 */
    205 // >>> DAM, TransArray optimization
    206   private SimpleArraySet transitions = new SimpleArraySet();
    207 // >>> DAM, end
    208
    209   /**
    210    * Is this state a final one?
    211    */
    212   protected boolean isFinal = false;
    213
    214   /**
    215    * The right hand side associated to the rule for which this state recognizes
    216    * the lhs.
    217    */
    218   protected RightHandSide action = null;
    219
    220   /**
    221    * The unique index of this state.
    222    */
    223   protected int myIndex;
    224
    225   /**
    226    * The class data member used for generating unique indices for State
    227    * instances.
    228    */
    229   protected static int index = 0;
    230
    231   /**
    232    * The index in the definition file of the rule that was used for creating
    233    * this state.
    234    * NOTE: this member is consistent only for FINAL STATES!
    235    */
    236   protected int fileIndex = 0;
    237
    238   /**
    239    * The priority of the rule from which this state derived.
    240    *
    241    */
    242   protected int priority = -1;
    243
    244 } // State
    245

| State |