| PrioritisedRuleList |

    1   /*
    2    *  PrioritisedRuleList.java - transducer class
    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   *  Hamish Cunningham, 27/07/98
    12   *
    13   *  $Id: PrioritisedRuleList.java,v 1.5 2001/09/13 12:09:50 kalina Exp $
    14   */
    15
    16
    17  package gate.jape;
    18
    19  import java.util.*;
    20
    21
    22  /**
    23    * A list of rules ordered according to priority. May be used for ordering
    24    * non-matched rules (in which case the order is based on
    25    * priority/position), or matched rules (in which case the order is based
    26    * on matched lenght/priority/position). Note that position represents
    27    * the idea of order within an input file; it is assumed that this is the
    28    * same as the order of addition of the rules to the list, i.e. a rule
    29    * added 5th is assumed to occupy 5th place in the file (or other rule
    30    * source). This class is based on JGL's DList, which allows for fast
    31    * insertion of elements at any point. The highest priority rule is the
    32    * first in the list, which may be accessed by <CODE>front()</CODE>.
    33    */
    34  public class PrioritisedRuleList extends ArrayList implements java.io.Serializable
    35  {
    36    /** Debug flag */
    37    private static final boolean DEBUG = false;
    38
    39    /** Adds a rule in order. Used for non-matched rules. Implements the
    40      * ordering based on priority/position.
    41      */
    42    public synchronized void add(Rule newRule) {
    43      /* for each rule,
    44       *   if it is higher priority, continue;
    45       *   else if it is same priority
    46       *     if it is higher position, continue;
    47       *     else break
    48       *   else (it is lower priority) break
    49       * insert newRule before current position (which may be finish)
    50       */
    51      Iterator iterator = this.iterator();
    52      int i = 0;
    53      for(  ; iterator.hasNext(); i++) {
    54        Rule rule = (Rule) iterator.next();
    55        int rulePriority =  rule.getPriority();
    56        int newRulePriority = newRule.getPriority();
    57        int rulePosition =  rule.getPosition();
    58        int newRulePosition = newRule.getPosition();
    59
    60        if(rulePriority > newRulePriority)
    61          continue;
    62        else if(rulePriority == newRulePriority) {
    63          if(rulePosition < newRulePosition)
    64            continue;
    65          else
    66            break;
    67        } else {
    68          break;
    69        }
    70
    71      } // while not hit the end of the rules
    72
    73
    74      this.add(i, newRule);
    75    } // add(Rule)
    76
    77    /** Adds a rule in order. Used for matched rules. Implements the
    78      * ordering based on length/priority/position. Length is given as
    79      * a parameter.
    80      */
    81    public synchronized void add(Rule newRule, int newRuleLength) {
    82      /* for each rule,
    83       *   if it is longer than the new one, continue;
    84       *   else if it is the same length
    85       *     if it is higher priority, continue;
    86       *     else if it is same priority
    87       *       if it is higher position, continue;
    88       *       else break;
    89       *     else (it is lower priority) break;
    90       *   else (it is shorter) break;
    91       * insert newRule before current position (which may be finish)
    92       */
    93      Iterator iterator = this.iterator();
    94      int i = 0;
    95      for(  ; iterator.hasNext(); i++) {
    96        Rule rule = (Rule) iterator.next();
    97        int rulePriority =  rule.getPriority();
    98        int newRulePriority = newRule.getPriority();
    99        int rulePosition =  rule.getPosition();
    100       int newRulePosition = newRule.getPosition();
    101       int ruleLength = rule.getEndPosition() - rule.getStartPosition();
    102
    103       if(ruleLength > newRuleLength)
    104         continue;
    105       else if(ruleLength == newRuleLength) {
    106         if(rulePriority > newRulePriority)
    107           continue;
    108         else if(rulePriority == newRulePriority) {
    109           if(rulePosition < newRulePosition)
    110             continue;
    111           else
    112             break;
    113         } else {
    114           break;
    115         }
    116       } else {
    117         break;
    118       }
    119
    120     } // while not hit the end of the rules
    121
    122     add(i, newRule);
    123   } // add(Rule,int)
    124
    125 } // class PrioritisedRuleList
    126
    127
    128 // $Log: PrioritisedRuleList.java,v $
    129 // Revision 1.5  2001/09/13 12:09:50  kalina
    130 // Removed completely the use of jgl.objectspace.Array and such.
    131 // Instead all sources now use the new Collections, typically ArrayList.
    132 // I ran the tests and I ran some documents and compared with keys.
    133 // JAPE seems to work well (that's where it all was). If there are problems
    134 // maybe look at those new structures first.
    135 //
    136 // Revision 1.4  2000/11/08 16:35:03  hamish
    137 // formatting
    138 //
    139 // Revision 1.3  2000/10/16 16:44:34  oana
    140 // Changed the comment of DEBUG variable
    141 //
    142 // Revision 1.2  2000/10/10 15:36:36  oana
    143 // Changed System.out in Out and System.err in Err;
    144 // Added the DEBUG variable seted on false;
    145 // Added in the header the licence;
    146 //
    147 // Revision 1.1  2000/02/23 13:46:10  hamish
    148 // added
    149 //
    150 // Revision 1.1.1.1  1999/02/03 16:23:02  hamish
    151 // added gate2
    152 //
    153 // Revision 1.6  1998/10/01 16:06:34  hamish
    154 // new appelt transduction style, replacing buggy version
    155 //
    156 // Revision 1.5  1998/09/17 10:24:02  hamish
    157 // added options support, and Appelt-style rule application
    158 //
    159 // Revision 1.4  1998/08/12 19:05:47  hamish
    160 // fixed multi-part CG bug; set reset to real reset and fixed multi-doc bug
    161 //
    162 // Revision 1.3  1998/07/30 11:05:24  mks
    163 // more jape
    164 //
    165 // Revision 1.2  1998/07/29 11:07:08  hamish
    166 // first compiling version
    167 //
    168 // Revision 1.1.1.1  1998/07/28 16:37:46  hamish
    169 // gate2 lives
    170

| PrioritisedRuleList |