- public void performEmptyReductions() { state.invokeReductions(phase().token, this, null, null); }
- public final void invoke(Position r, Node n, Node n2) {
- //reductions++;
- //if (r.pos==1) single_newnode++;
- //if (r.pos>1) multi_newnode++;
- if (n==null || n2==null || r.pos==0) {
- if (r.pos==0) {
- if (n==null) n = this;
- else return;
- }
- if (n==null) return;
- Forest[] holder = new Forest[r.pos];
- if (r.pos==0) n.finish(r, r.zero(n.phase().getLocation().createRegion(n.phase().getLocation())), n.phase());
- else n.reduce(r, r.pos-1, n.phase(), null);
- } else {
- if (r.pos<=0) throw new Error("called wrong form of reduce()");
- int pos = r.pos-1;
- n.reduce(r, pos, n.phase(), n2);
- }
+ private final GSS.Phase phase;
+ private final Parser.Table.State state;
+ private final boolean fromEmptyReduction;
+ //private FastSet<Result> results = new FastSet<Result>();
+ private HashSet<Result> results = new HashSet<Result>();
+
+ public final void invoke(Position r, Boolean emptyProductions, Result only) {
+ if (emptyProductions != (r.pos==0)) return;
+ if (r.pos==0) finish(r, r.zero(phase().getLocation().createRegion(phase().getLocation())), phase());
+ else reduce(r, r.pos-1, phase(), only);