void reachable(HashSet<Sequence.Position> h) { for(Sequence s : alternatives) s.reachable(h); }
+ Topology toAtom() {
+ if (alternatives.size()==0) throw new RuntimeException("cannot build an Atom from a Union with no productions");
+ Topology ret = null;
+ for(Sequence s : this) {
+ Topology a = s.toAtom();
+ if (ret==null) ret = a.dup();
+ else ret = ret.union(a.dup());
+ }
+ if (ret==null) throw new RuntimeException("confusion on " + this);
+ return ret;
+ }
+
/** adds an alternative */
public void add(Sequence s) { alternatives.add(s); }
this.synthetic = synthetic;
}
+ public static Union epsilon = new Union("()");
+ static { epsilon.add(Sequence.empty); }
+
private Forest.Ref epsilonForm = null;
Forest epsilonForm() {
if (epsilonForm != null) return epsilonForm;
public String toString() { return shortForm; }
private static String pad(int i,String s) { return s.length() >= i ? s : pad(i-1,s)+" "; }
- void toString(StringBuffer sb) {
+ public void toString(StringBuffer sb) {
if (synthetic) return;
boolean first = true;
if (alternatives.size()==0) {