- static class Table<Token> extends Walk.Cache {
-
- public String toString() {
- StringBuffer sb = new StringBuffer();
- sb.append("parse table");
- for(State<Token> state : all_states.values()) {
- sb.append(" " + state + "\n");
- for(Topology<Token> t : state.shifts) {
- sb.append(" shift \""+
- new edu.berkeley.sbp.chr.CharTopology((IntegerTopology<Character>)t)+"\" => ");
- for(State st : state.shifts.getAll(t))
- sb.append(st.idx+" ");
- sb.append("\n");
- }
- for(Topology<Token> t : state.reductions)
- sb.append(" reduce \""+
- new edu.berkeley.sbp.chr.CharTopology((IntegerTopology<Character>)t)+"\" => " +
- state.reductions.getAll(t) + "\n");
- }
- return sb.toString();
- }
-
- public final Walk.Cache cache = this;
-
- private void walk(Element e, HashSet<SequenceOrElement> hs) {
- if (e==null) return;
- if (hs.contains(e)) return;
- hs.add(e);
- if (e instanceof Atom) return;
- for(Sequence s : (Union)e)
- walk(s, hs);
- }
- private void walk(Sequence s, HashSet<SequenceOrElement> hs) {
- hs.add(s);
- for(Position p = s.firstp(); p != null; p = p.next())
- walk(p.element(), hs);
- for(Sequence ss : s.needs()) walk(ss, hs);
- for(Sequence ss : s.hates()) walk(ss, hs);
- }