Rule.java
001 /*
002  *  Rule.java - transducer class
003  *
004  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
005  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  *
007  *  This file is part of GATE (see http://gate.ac.uk/), and is free
008  *  software, licenced under the GNU Library General Public License,
009  *  Version 2, June 1991 (in the distribution as file licence.html,
010  *  and also available at http://gate.ac.uk/gate/licence.html).
011  *
012  *  Hamish Cunningham, 24/07/98
013  *
014  *  $Id: Rule.java 17768 2014-04-03 14:37:54Z markagreenwood $
015  */
016 
017 
018 package gate.jape;
019 
020 import gate.AnnotationSet;
021 import gate.Document;
022 import gate.event.ProgressListener;
023 import gate.event.StatusListener;
024 import gate.util.GateClassLoader;
025 import gate.util.Out;
026 import gate.util.Strings;
027 
028 import java.io.Serializable;
029 
030 /**
031   * A CPSL rule. Has an LHS, RHS and a name, and a priority.
032   */
033 public class Rule extends Transducer
034 implements JapeConstants, Serializable
035 {
036   private static final long serialVersionUID = 564304936210127542L;
037 
038   /** Debug flag */
039   private static final boolean DEBUG = false;
040 
041   /** Construction */
042   public Rule(
043     String name, int position, int priority,
044     LeftHandSide lhs, RightHandSide rhs
045   ) {
046     this.name = name;
047     this.position = position;
048     this.priority = priority;
049     this.lhs = lhs;
050     this.rhs = rhs;
051   // Construction
052   
053   /** Copy constructor */
054   public Rule(Rule existingRule) {
055     this.name = existingRule.name;
056     this.position = existingRule.position;
057     this.priority = existingRule.priority;
058     this.lhs = existingRule.lhs;
059     this.rhs = new RightHandSide(existingRule.rhs);
060   }
061 
062   /** The LHS or pattern of the rule. */
063   private LeftHandSide lhs;
064 
065   /** The RHS or action of the rule. */
066   private RightHandSide rhs;
067 
068   /** The priority of the rule. */
069   private int priority;
070 
071   /** Get the rule priority. */
072   public int getPriority() { return priority; }
073 
074   /** The rule's position in sequence (e.g. order in file). */
075   private int position;
076 
077   /** Get the rule's position in sequence (e.g. order in file). */
078   public int getPosition() { return position; }
079 
080   /** If we're pending (have matched), get the position we want to fire in,
081     * else -1.
082     */
083   public int pending() {
084     return pendingPosition;
085   // pending
086 
087   /** If we matched but didn't fire yet, this is our pending position. */
088   private int pendingPosition = -1;
089 
090   /** Flag for end of document during getNextMatch. */
091   private boolean weFinished = false;
092 
093   /** Have we hit the end of the document without matching? */
094   public boolean finished() {
095     return weFinished;
096   // finished
097 
098   /** Finish: replace dynamic data structures with Java arrays; called
099     * after parsing. WARNING:
100     * bad choice of names: this is not related to the weFinished
101     * member or the finished method!
102     */
103   @Override
104   public void finish(GateClassLoader classloader) {
105     lhs.finish();
106     rhs.finish(classloader);
107   // finish
108 
109 
110 
111 
112   /** Apply the RHS of this rule (LHS must have been matched first). */
113   @Override
114   public void transduce(Document doc, AnnotationSet inputAS,
115                         AnnotationSet outputASthrows JapeException {
116     // the righthand side does the transduction, using bindings from lhs */
117     if(DEBUGOut.println("applying rule " + name);
118 //    rhs.transduce(doc);
119     /*Debug.pr(
120       this, "Rule.transduce: annotations after transduction: " +
121       doc.selectAnnotations("Name", new FeatureMap()).toString() +
122       Debug.getNl()
123     );*/
124 
125     // clear the caches of matched annotations in the LHS
126 //    reset();
127     //Debug.pr(this, "LHS after reset: " + lhs.toString());
128 
129   // transduce
130 
131 
132   /** For debugging. */
133   // public String getName() { return name; }
134 
135   /** Clean up (delete action class files, for e.g.). */
136   @Override
137   public void cleanUp() {
138     RightHandSide.cleanUp();
139   // cleanUp
140 
141 
142   /** Create a string representation of the object. */
143   @Override
144   public String toString() { return toString("")}
145 
146   /** Create a string representation of the object. */
147   @Override
148   public String toString(String pad) {
149     String newline = Strings.getNl();
150     String newPad = Strings.addPadding(pad, INDENT_PADDING);
151 
152     StringBuffer buf = new StringBuffer(
153       pad + "Rule: name(" + name + "); position(" + position + "); priority(" +
154       priority + "); pendingPosition(" + pendingPosition + "); " +
155       "weFinished(" + weFinished + "); lhs(" + newline +
156       lhs.toString(newPad+ newline + pad + "); rhs(" + newline +
157       rhs.toString(newPad+ newline + pad + ");"
158     );
159 
160     buf.append(newline + pad + ") Rule." + newline);
161 
162     return buf.toString();
163   // toString
164 
165   //needed by FSM
166   public LeftHandSide getLHS(){
167     return lhs;
168   }
169   public RightHandSide getRHS(){
170     return rhs;
171   }
172 
173   //StatusReporter VOID Implementation
174   @Override
175   public void addStatusListener(StatusListener listener){}
176   @Override
177   public void removeStatusListener(StatusListener listener){}
178 
179   //ProcessProgressReporter VOID implementation
180   public void addProcessProgressListener(ProgressListener listener){}
181   public void removeProcessProgressListener(ProgressListener listener){}
182   //ProcessProgressReporter implementation ends here
183 
184 // class Rule
185 
186 
187 // $Log$
188 // Revision 1.17  2005/01/11 13:51:36  ian
189 // Updating copyrights to 1998-2005 in preparation for v3.0
190 //
191 // Revision 1.16  2004/07/21 17:10:08  akshay
192 // Changed copyright from 1998-2001 to 1998-2004
193 //
194 // Revision 1.15  2004/03/25 13:23:04  valyt
195 // 
196 // Style: static access to static members
197 //
198 // Revision 1.14  2004/03/25 13:01:14  valyt
199 // Imports optimisation throughout the Java sources
200 // (to get rid of annoying warnings in Eclipse)
201 //
202 // Revision 1.13  2001/09/13 12:09:50  kalina
203 // Removed completely the use of jgl.objectspace.Array and such.
204 // Instead all sources now use the new Collections, typically ArrayList.
205 // I ran the tests and I ran some documents and compared with keys.
206 // JAPE seems to work well (that's where it all was). If there are problems
207 // maybe look at those new structures first.
208 //
209 // Revision 1.12  2001/03/06 20:11:14  valyt
210 //
211 // <b><em><strong>DOCUMENTATION</></></> for most of the GUI classes.
212 //
213 // Cleaned up some obsolete classes
214 //
215 // Revision 1.11  2001/02/20 12:25:49  valyt
216 //
217 // Fixed the Jpae priorities bug
218 //
219 // Revision 1.10  2001/01/21 20:51:31  valyt
220 // Added the DocumentEditor class and the necessary changes to the gate API
221 //
222 // Revision 1.9  2000/11/08 16:35:03  hamish
223 // formatting
224 //
225 // Revision 1.8  2000/10/26 10:45:31  oana
226 // Modified in the code style
227 //
228 // Revision 1.7  2000/10/16 16:44:34  oana
229 // Changed the comment of DEBUG variable
230 //
231 // Revision 1.6  2000/10/10 15:36:37  oana
232 // Changed System.out in Out and System.err in Err;
233 // Added the DEBUG variable seted on false;
234 // Added in the header the licence;
235 //
236 // Revision 1.5  2000/07/04 14:37:39  valyt
237 // Added some support for Jape-ing in a different annotations et than the default one;
238 // Changed the L&F for the JapeGUI to the System default
239 //
240 // Revision 1.4  2000/07/03 21:00:59  valyt
241 // Added StatusBar and ProgressBar support for tokenisation & Jape transduction
242 // (it looks great :) )
243 //
244 // Revision 1.3  2000/05/05 12:51:12  valyt
245 // Got rid of deprecation warnings
246 //
247 // Revision 1.2  2000/04/14 18:02:46  valyt
248 // Added some gate.fsm classes
249 // added some accessor function in old jape classes
250 //
251 // Revision 1.1  2000/02/23 13:46:11  hamish
252 // added
253 //
254 // Revision 1.1.1.1  1999/02/03 16:23:02  hamish
255 // added gate2
256 //
257 // Revision 1.16  1998/11/01 21:21:40  hamish
258 // use Java arrays in transduction where possible
259 //
260 // Revision 1.15  1998/10/30 14:06:46  hamish
261 // added getTransducer
262 //
263 // Revision 1.14  1998/10/29 12:16:13  hamish
264 // changed reset to not do lhs if weFinished  - coz
265 // there should be no state cached if the last try failed
266 //
267 // Revision 1.13  1998/10/01 16:06:37  hamish
268 // new appelt transduction style, replacing buggy version
269 //
270 // Revision 1.12  1998/09/18 13:36:00  hamish
271 // made Transducer a class
272 //
273 // Revision 1.11  1998/08/19 20:21:43  hamish
274 // new RHS assignment expression stuff added
275 //
276 // Revision 1.10  1998/08/12 19:05:48  hamish
277 // fixed multi-part CG bug; set reset to real reset and fixed multi-doc bug
278 //
279 // Revision 1.9  1998/08/12 15:39:43  hamish
280 // added padding toString methods
281 //
282 // Revision 1.8  1998/08/10 14:16:39  hamish
283 // fixed consumeblock bug and added batch.java
284 //
285 // Revision 1.7  1998/08/03 21:44:58  hamish
286 // moved parser classes to gate.jape.parser
287 //
288 // Revision 1.6  1998/08/03 19:51:27  hamish
289 // rollback added
290 //
291 // Revision 1.5  1998/07/31 16:50:19  mks
292 // RHS compilation works; it runs - and falls over...
293 //
294 // Revision 1.4  1998/07/31 13:12:27  mks
295 // done RHS stuff, not tested
296 //
297 // Revision 1.3  1998/07/30 11:05:25  mks
298 // more jape
299 //
300 // Revision 1.2  1998/07/29 11:07:11  hamish
301 // first compiling version
302 //
303 // Revision 1.1.1.1  1998/07/28 16:37:46  hamish
304 // gate2 lives