X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=31bd1b368a5281c2734c214ffdc4e24c30c4881a;hp=87b550800ed9a3edd42add7d07a37735c030446b;hb=fa858dc4acddd3e32126ff2558e0860315a84758;hpb=6a2ea790f843e058c7e67d3c7d1deebadcfe1fd5 diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 87b5508..31bd1b3 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -18,11 +18,11 @@ public abstract class Parser { public abstract Forest shiftToken(Tok t, Input.Location loc); /** parse input, using the table pt to drive the parser */ - public Forest parse(Input.Stream input) throws IOException, ParseFailed { + public Forest parse(Input input) throws IOException, ParseFailed { GSS gss = new GSS(); Input.Location loc = input.getLocation(); GSS.Phase current = gss.new Phase(null, this, null, input.next(1, 0, 0), loc, null); - current.newNode(null, Forest.leaf(null, null), pt.start, true); + current.newNode(null, Forest.leaf(null, null, null), pt.start, true); int count = 1; for(;;) { loc = input.getLocation(); @@ -38,17 +38,10 @@ public abstract class Parser { // Table ////////////////////////////////////////////////////////////////////////////// /** an SLR(1) parse table which may contain conflicts */ - public static class Table extends Walk.Cache { + static class Table extends Walk.Cache { public final Walk.Cache cache = this; - public void optimize(Functor f) { - for(State state : all_states.values()) { - state.oreductions = state.reductions.optimize(f); - state.oshifts = state.shifts.optimize(f); - } - } - private void walk(Element e, HashSet hs) { if (e==null) return; if (hs.contains(e)) return; @@ -73,7 +66,7 @@ public abstract class Parser { public Table(String startSymbol, Topology top) { this(new Union(startSymbol), top); } public Table(Union ux, Topology top) { Union start0 = new Union("0"); - start0.add(new Sequence.Singleton(ux, null, null)); + start0.add(new Sequence.Singleton(ux)); for(Sequence s : start0) cache.eof.put(s, true); cache.eof.put(start0, true); @@ -109,17 +102,22 @@ public abstract class Parser { if (p.element() != null && p.element() instanceof Atom) state.shifts.addAll(state.gotoSetTerminals.subset(((Atom)p.element()))); } + if (top instanceof IntegerTopology) + for(State state : all_states.values()) { + state.oreductions = state.reductions.optimize(((IntegerTopology)top).functor()); + state.oshifts = state.shifts.optimize(((IntegerTopology)top).functor()); + } } private boolean isRightNullable(Position p) { if (p.isLast()) return true; - if (!p.element().possiblyEpsilon(this)) return false; + if (!possiblyEpsilon(p.element())) return false; return isRightNullable(p.next()); } /** a single state in the LR table and the transitions possible from it */ - public class State implements Comparable>, IntegerMappable, Iterable { + class State implements Comparable>, IntegerMappable, Iterable { public final int idx = master_state_idx++; private final HashSet hs;