// if the element following this position is an atom, copy the corresponding
// set of rows out of the "master" goto table and into this state's shift table
if (p.element() != null && p.element() instanceof Atom)
- state.shifts.addAll(state.gotoSetTerminals.subset(((Atom)p.element())));
+ state.shifts.addAll(state.gotoSetTerminals.subset(((Atom)p.element()).getTokenTopology()));
}
if (top instanceof IntegerTopology)
for(State<Tok> state : all_states.values()) {
Atom a = (Atom)position.element();
HashSet<Position> hp = new HashSet<Position>();
reachable(position.next(), hp);
- bag0.addAll(a, hp);
+ bag0.addAll(a.getTokenTopology(), hp);
}
// Step 1b: for each _minimal, contiguous_ set of characters having an identical next-position
move.addAll(y, hp);
}
}
- for(Element y : move) {
+ OUTER: for(Element y : move) {
HashSet<Position> h = move.getAll(y);
State<Tok> s = all_states.get(h) == null ? new State<Tok>(h, all_states, all_elements) : all_states.get(h);
// if a reduction is "lame", it should wind up in the dead_state after reducing
- if (y instanceof Sequence && ((Sequence)y).lame)
- ((HashMap)gotoSetNonTerminals).put(y, dead_state);
- else
- gotoSetNonTerminals.put(y, s);
+ if (y instanceof Sequence) {
+ for(Position p : hs) {
+ if (p.element() != null && (p.element() instanceof Union)) {
+ Union u = (Union)p.element();
+ for(Sequence seq : u)
+ if (seq.needs.contains((Sequence)y) || seq.hates.contains((Sequence)y)) {
+ // FIXME: what if there are two "routes" to get to the sequence?
+ ((HashMap)gotoSetNonTerminals).put(y, dead_state);
+ continue OUTER;
+ }
+ }
+ }
+ }
+ gotoSetNonTerminals.put(y, s);
}
}