// // This software is now distributed according to // the Lesser Gnu Public License. Please see // http://www.gnu.org/copyleft/lesser.txt for // the details. // -- Happy Computing! // package com.stevesoft.ewe_pat; import ewe.util.*; /** This class implements the (?: ... ) extended Pattern. It provides a base class from which we derive the [ ... ], ( ... ), (?! ... ), and (?= ... ) patterns. */ class Or extends Pattern { Vector v; Pattern[] pv = null; Or() { v = new Vector(); } String leftForm() { return "(?:"; } String rightForm() { return ")"; } String sepForm() { return "|"; } public Or addOr(Pattern p) { pv = null; v.addElement(p); p.setParent(this); return this; } public String toString() { int i; StringBuffer sb = new StringBuffer(); sb.append(leftForm()); if(v.size()>0) sb.append( ((Pattern)v.elementAt(0)).toString() ); for(i=1;i<v.size();i++) { sb.append(sepForm()); sb.append( ((Pattern)v.elementAt(i)).toString() ); } sb.append(rightForm()); sb.append(nextString()); return sb.toString(); } public int matchInternal(int pos,Pthings pt) { if(pv == null) { pv = new Pattern[v.size()]; v.copyInto(pv); } for(int i=0;i<v.size();i++) { Pattern p = pv[i];//(Pattern)v.elementAt(i); int r = p.matchInternal(pos,pt); if(r >= 0) return r; } return -1; } public patInt minChars() { if(v.size()==0) return new patInt(0); patInt m = ((Pattern)v.elementAt(0)).countMinChars(); for(int i=1;i<v.size();i++) { Pattern p = (Pattern)v.elementAt(i); m.mineq(p.countMinChars()); } return m; } public patInt maxChars() { if(v.size()==0) return new patInt(0); patInt m = ((Pattern)v.elementAt(0)).countMaxChars(); for(int i=1;i<v.size();i++) { Pattern p = (Pattern)v.elementAt(i); m.maxeq(p.countMaxChars()); } return m; } Pattern clone1(Hashtable h) { Or o=new Or(); h.put(this,o); h.put(o,o); for(int i=0;i<v.size();i++) o.v.addElement( ((Pattern)v.elementAt(i)).clone(h) ); return o; } };