final HashSet<Sequence> needs = new HashSet<Sequence>();
final HashSet<Sequence> hates = new HashSet<Sequence>();
- // FIXME: these are ugly -- migrate into Cache
+ // FIXME: these are ugly -- migrate into Grammar
HashMap<Sequence,Boolean> canNeed = new HashMap<Sequence,Boolean>();
HashMap<Sequence,Boolean> canKill = new HashMap<Sequence,Boolean>();
this.firstp = new Position(0, null);
}
- // DO NOT MESS WITH THE FOLLOWING LINE!!!
- private Forest.Many epsilonForm = null;
- Forest epsilonForm(Input.Region loc) {
- if (epsilonForm!=null) return epsilonForm;
- epsilonForm = new Forest.Many();
- epsilonForm.merge(firstp().rewrite(loc, false));
- return epsilonForm;
- }
+ abstract Forest epsilonForm(Input.Region loc, Grammar cache);
protected abstract <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p);
public int ord = -1;
private Forest zero = null;
+ /*
public Forest zero(Input.Region reg) {
if (zero != null) return zero;
if (pos > 0) throw new RuntimeException("Position.zero(): pos>0");
return zero = rewrite(reg);
}
-
+ */
final int pos;
private final Position next;
private final Position prev;
// Position /////////////////////////////////////////////////////////////////////////////////
- final <T> Forest<T> rewrite(Input.Region loc) { return rewrite(loc, true); }
- private final <T> Forest<T> rewrite(Input.Region loc, boolean epsilonCheck) {
- if (epsilonCheck && this==firstp()) return epsilonForm(loc);
+ final <T> Forest<T> rewrite(Input.Region loc, Grammar cache) {
+ if (this==firstp()) epsilonForm(loc, cache);
for(int i=0; i<pos; i++) if (holder[i]==null) throw new Error("realbad " + i);
for(int i=pos; i<elements.length; i++) {
- if (holder[i]==null) holder[i] = elements[i].epsilonForm(loc);
- if (holder[i]==null) throw new Error("bad " + i);
+ if (holder[i]==null) holder[i] = ((Union)elements[i]).epsilonForm(loc, cache);
+ if (holder[i]==null) throw new Error("bad");
}
return Sequence.this.postReduce(loc, holder, this);
}
public <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p) {
return (Forest<T>)Forest.create(loc, result, null, false);
}
+ Forest epsilonForm(Input.Region loc, Grammar cache) {
+ return Forest.create(loc, result, null, false);
+ }
}
static class Singleton extends Sequence {
public Singleton(Element[] e, int idx) { super(e); this.idx = idx; }
public <T> Forest<T> postReduce(Input.Region loc, Forest<T>[] args, Position p) { return args[idx]; }
Sequence _clone() { return new Singleton(elements,idx); }
+ Forest epsilonForm(Input.Region loc, Grammar cache) {
+ return ((Union)elements[idx]).epsilonForm(loc, cache);
+ }
}
static class Unwrap extends Sequence {
for(int i=0; i<args.length; i++) if (!drops[i]) args2[j++] = args[i];
return Forest.create(loc, (T)tag, args2, true);
}
+ Forest epsilonForm(Input.Region loc, Grammar cache) {
+ return Forest.create(loc, tag, new Forest[0], false);
+ }
}
static class RewritingSequence extends Sequence {
if (spacing) for(int i=0; i<50-len; i++) sb.append(' ');
return sb;
}
+ Forest epsilonForm(Input.Region loc, Grammar cache) {
+ return Forest.create(loc, tag, new Forest[0], false);
+ }
}
}