- Iterable<Result> {
-
- /** which GSS.Phase this Node belongs to */
- public GSS.Phase phase() { return phase; }
- public Iterator<Result> iterator() { return results.iterator(); }
- public Parser.Table.State state() { return state; }
-
- public int toInt() { return idx; }
-
- boolean destroyed = false;
-
- public void check() {
- if (destroyed) return;
- boolean dead = true;
- // - all nodes must have a predecessor
- // - non-doomed nodes must either:
- // - be on the frontier or
- // - have a non-doomed node closer to the frontier than themself
- if (phase.isFrontier()) dead = false;
- else for(Result r : successors)
- if (state.doomed) { if (r.usedByAnyNode()) { dead = false; break; } }
- else { if (r.usedByNonDoomedNode()) { dead = false; break; } }
- dead |= results.size()==0;
- if (!dead) return;
- destroyed = true;
- if (phase() != null && phase().hash != null)
- phase().hash.remove(state, predPhase);
- while(successors.size()>0)
- for(Result r : successors) {
- successors.remove(r);
- r.removePred(this);
- break;
- }
- while(results.size()>0)
- for(Result r : results) {
- results.remove(r);
- r.removeSucc(this);
- break;
- }
- results = null;
- successors = null;
- }
-
- //////////////////////////////////////////////////////////////////////
-
- private static int node_idx = 0;
- private final int idx = node_idx++;