1   /* 
2    *  PatternElement.java - transducer class
3    *
4    *  Copyright (c) 1998-2005, 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, 24/07/98
12   *
13   *  $Id: PatternElement.java,v 1.7 2005/01/11 13:51:36 ian Exp $
14   */
15  
16  
17  package gate.jape;
18  
19  import java.util.Stack;
20  
21  import gate.AnnotationSet;
22  
23  
24  /**
25    * Superclass of the various types of pattern element, and of
26    * ConstraintGroup. Inherits from Matcher, providing matches and reset.
27    * Provides access to the annotations that are cached by subclasses, and
28    * multilevel rollback of those caches. Stores the match history.
29    */
30  abstract public class PatternElement implements Cloneable, Matcher,
31            JapeConstants, java.io.Serializable
32  {
33    /** Debug flag */
34    private static final boolean DEBUG = false;
35  
36    /** Match history stack, for use in rollback. In BasicPatternElements
37      * the objects on the stack are Integers giving the number of annots that
38      * were cached at that point in the history. In ComplexPatternElements
39      * the objects are Integers giving the number of times the component
40      * ConstraintGroup was successfully matched. In ConstraintGroups the
41      * elements are arrays representing conjunctions of PatternElement that
42      * succeeded at that point in the history.
43      */
44    protected Stack matchHistory;
45  
46    /** Anonymous construction. */
47    public PatternElement() {
48      matchHistory = new Stack();
49    } // Anonymous constructor.
50  
51    /** Cloning for processing of macro references. Note that it doesn't
52      * really clone the match history, just set it to a new Stack. This is
53      * because a) JGL doesn't have real clone methods and b) we don't
54      * actually need it anywhere but during parsing the .jape, where there
55      * is no match history yet.
56      */
57    public Object clone() {
58      try {
59        PatternElement newPE = (PatternElement) super.clone();
60        newPE.matchHistory = new Stack();
61        return newPE;
62      } catch(CloneNotSupportedException e) {
63        throw(new InternalError(e.toString()));
64      }
65    } // clone
66  
67    /** Access to the annotations that have been matched. */
68    abstract public AnnotationSet getMatchedAnnots();
69  
70    /** Multilevel rollback of annotation caches. */
71    abstract public void rollback(int arity);
72  
73    /** Reset: clear annotation caches etc. Most of the behaviour of
74      * this method is the responsibility of subclasses.
75      */
76    public void reset() {
77      matchHistory = new Stack();
78    } // reset
79  
80    /** Create a string representation of the object with padding. */
81    abstract public String toString(String pad);
82  
83  } // class PatternElement
84  
85  
86  // $Log: PatternElement.java,v $
87  // Revision 1.7  2005/01/11 13:51:36  ian
88  // Updating copyrights to 1998-2005 in preparation for v3.0
89  //
90  // Revision 1.6  2004/07/21 17:10:08  akshay
91  // Changed copyright from 1998-2001 to 1998-2004
92  //
93  // Revision 1.5  2004/03/25 13:01:14  valyt
94  // Imports optimisation throughout the Java sources
95  // (to get rid of annoying warnings in Eclipse)
96  //
97  // Revision 1.4  2000/11/08 16:35:03  hamish
98  // formatting
99  //
100 // Revision 1.3  2000/10/16 16:44:34  oana
101 // Changed the comment of DEBUG variable
102 //
103 // Revision 1.2  2000/10/10 15:36:36  oana
104 // Changed System.out in Out and System.err in Err;
105 // Added the DEBUG variable seted on false;
106 // Added in the header the licence;
107 //
108 // Revision 1.1  2000/02/23 13:46:09  hamish
109 // added
110 //
111 // Revision 1.1.1.1  1999/02/03 16:23:02  hamish
112 // added gate2
113 //
114 // Revision 1.8  1998/11/03 19:06:49  hamish
115 // java stack, not jgl stack for matchHistory
116 //
117 // Revision 1.7  1998/11/01 23:18:44  hamish
118 // use new instead of clear on containers
119 //
120 // Revision 1.6  1998/09/26 09:19:18  hamish
121 // added cloning of PE macros
122 //
123 // Revision 1.5  1998/08/12 15:39:41  hamish
124 // added padding toString methods
125 //
126 // Revision 1.4  1998/08/03 19:51:24  hamish
127 // rollback added
128 //
129 // Revision 1.3  1998/07/30 11:05:22  hamish
130 // more jape
131 //
132 // Revision 1.2  1998/07/29 11:07:06  hamish
133 // first compiling version
134 //
135 // Revision 1.1.1.1  1998/07/28 16:37:46  hamish
136 // gate2 lives
137