ComplexPatternElement.java
001 /*
002  *  ComplexPatternElement.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: ComplexPatternElement.java 17597 2014-03-08 15:19:43Z markagreenwood $
015  */
016 
017 
018 package gate.jape;
019 
020 import gate.util.Strings;
021 
022 import java.io.Serializable;
023 import java.util.Iterator;
024 
025 
026 /**
027   * A pattern element enclosed in round brackets. Has a
028   * ConstraintGroup, optional Kleene operator and optional binding name.
029   */
030 public class ComplexPatternElement extends PatternElement
031 implements JapeConstants, Serializable
032 {
033   private static final long serialVersionUID = -1660335210282070151L;
034 
035   /** Kleene operator (defaults to none). Other values: KLEENE_STAR (*);
036     * KLEENE_PLUS (+); KLEENE_QUERY (?) */
037   private KleeneOperator kleeneOp = null;
038 
039   /** Binding name (may be null). */
040   private String bindingName = null;
041 
042   /** Get binding name. */
043   public String getBindingName() { return bindingName; }
044 
045   /** Get a list of CPEs that we contain. */
046   protected Iterator<ComplexPatternElement> getCPEs() {
047     return constraintGroup.getCPEs();
048   // getCPEs
049 
050   /** The recursive definition of what pattern elements make up this one. */
051   private ConstraintGroup constraintGroup;
052 
053   public ComplexPatternElement(
054     ConstraintGroup constraintGroup,
055     KleeneOperator.Type kleeneType,
056     String bindingName
057   ) {
058     this(constraintGroup, new KleeneOperator(kleeneType), bindingName);
059   }
060 
061   public ComplexPatternElement(
062           ConstraintGroup constraintGroup,
063           KleeneOperator kleeneOp,
064           String bindingName
065         ) {
066           if (kleeneOp == null)
067             kleeneOp = new KleeneOperator(KleeneOperator.Type.SINGLE);
068           this.constraintGroup = constraintGroup;
069           this.kleeneOp = kleeneOp;
070           this.bindingName = bindingName;
071         }
072 
073   /** Construction from ConstraintGroup, min and max legal occurance limits,
074    * and binding name.
075    */
076   public ComplexPatternElement(
077     ConstraintGroup constraintGroup,
078     int minOccurance, int maxOccurance,
079     String bindingName
080   ) {
081     this.constraintGroup = constraintGroup;
082     this.kleeneOp = new KleeneOperator(minOccurance, maxOccurance);
083     this.bindingName = bindingName;
084   }
085 
086   /** Need cloning for processing of macro references. See comments on
087     <CODE>PatternElement.clone()</CODE>
088     */
089   @Override
090   public Object clone() {
091     ComplexPatternElement newPE = (ComplexPatternElementsuper.clone();
092     newPE.constraintGroup = (ConstraintGroupconstraintGroup.clone();
093     return newPE;
094   // clone
095 
096   /** Finish: replace dynamic data structures with Java arrays; called
097     * after parsing.
098     */
099   @Override
100   public void finish() {
101     constraintGroup.finish();
102   // finish
103 
104   /** Create a string representation of the object. */
105   @Override
106   public String toString() { return toString("")}
107 
108   /** Create a string representation of the object. */
109   @Override
110   public String toString(String pad) {
111     String newline = Strings.getNl();
112 
113     StringBuffer buf = new StringBuffer(
114       pad + "CPE: bindingName(" + bindingName + "); kleeneOp("
115     );
116 
117     if (kleeneOp != null)
118       buf.append(kleeneOp);
119 
120     buf.append(
121       "); constraintGroup(" + newline +
122       constraintGroup.toString(Strings.addPadding(pad, INDENT_PADDING)) +
123       newline + pad + ") CPE." + newline
124     );
125 
126     return buf.toString();
127   // toString
128   //needed by FSM
129 
130   public KleeneOperator getKleeneOp(){ return kleeneOp; };
131 
132   public ConstraintGroup getConstraintGroup(){ return constraintGroup; }
133 
134 // class ComplexPatternElement
135 
136 
137 // $Log$
138 // Revision 1.11  2005/01/11 13:51:36  ian
139 // Updating copyrights to 1998-2005 in preparation for v3.0
140 //
141 // Revision 1.10  2004/07/21 17:10:07  akshay
142 // Changed copyright from 1998-2001 to 1998-2004
143 //
144 // Revision 1.9  2004/03/25 13:01:15  valyt
145 // Imports optimisation throughout the Java sources
146 // (to get rid of annoying warnings in Eclipse)
147 //
148 // Revision 1.8  2001/09/13 12:09:49  kalina
149 // Removed completely the use of jgl.objectspace.Array and such.
150 // Instead all sources now use the new Collections, typically ArrayList.
151 // I ran the tests and I ran some documents and compared with keys.
152 // JAPE seems to work well (that's where it all was). If there are problems
153 // maybe look at those new structures first.
154 //
155 // Revision 1.7  2001/09/12 11:59:33  kalina
156 // Changed the old JAPE stuff to use the new Collections API,
157 // instead of com.objectspace stuff. Will eliminate that library
158 // completely very soon! Just one class left to re-implement,
159 //
160 // ParseCPSL.jj changed accordingly. All tested and no smoke.
161 //
162 // Revision 1.6  2000/11/08 16:35:02  hamish
163 // formatting
164 //
165 // Revision 1.5  2000/10/26 10:45:30  oana
166 // Modified in the code style
167 //
168 // Revision 1.4  2000/10/16 16:44:33  oana
169 // Changed the comment of DEBUG variable
170 //
171 // Revision 1.3  2000/10/10 15:36:35  oana
172 // Changed System.out in Out and System.err in Err;
173 // Added the DEBUG variable seted on false;
174 // Added in the header the licence;
175 //
176 // Revision 1.2  2000/04/14 18:02:46  valyt
177 // Added some gate.fsm classes
178 // added some accessor function in old jape classes
179 //
180 // Revision 1.1  2000/02/23 13:46:05  hamish
181 // added
182 //
183 // Revision 1.1.1.1  1999/02/03 16:23:01  hamish
184 // added gate2
185 //
186 // Revision 1.14  1998/11/13 13:17:16  hamish
187 // merged in the doc length bug fix
188 //
189 // Revision 1.13  1998/11/12 17:47:27  kalina
190 // A bug fixed, wasn't restoring the document length
191 //
192 // Revision 1.12  1998/11/05 13:36:29  kalina
193 // moved to use array of JdmAttributes for selectNextAnnotation instead
194 // of a sequence
195 //
196 // Revision 1.11  1998/11/01 21:21:35  hamish
197 // use Java arrays in transduction where possible
198 //
199 // Revision 1.10  1998/10/06 16:16:09  hamish
200 // negation percolation during constrain add; position advance when none at end
201 //
202 // Revision 1.9  1998/10/01 16:06:29  hamish
203 // new appelt transduction style, replacing buggy version
204 //
205 // Revision 1.8  1998/09/26 09:19:14  hamish
206 // added cloning of PE macros
207 //
208 // Revision 1.7  1998/09/17 16:48:29  hamish
209 // added macro defs and macro refs on LHS
210 //
211 // Revision 1.6  1998/08/12 15:39:32  hamish
212 // added padding toString methods
213 //
214 // Revision 1.5  1998/08/05 21:58:04  hamish
215 // backend works on simple test
216 //
217 // Revision 1.4  1998/08/03 19:51:19  hamish
218 // rollback added
219 //
220 // Revision 1.3  1998/07/30 11:05:14  hamish
221 // more jape
222 //
223 // Revision 1.2  1998/07/29 11:06:54  hamish
224 // first compiling version
225 //
226 // Revision 1.1.1.1  1998/07/28 16:37:46  hamish
227 // gate2 lives