From d6269a7a0a5b3fe84e75725deaac560117ffc26e Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 15 Jan 2006 04:29:00 -0500 Subject: [PATCH] checkpoint darcs-hash:20060115092900-5007d-dc3054f2bb2d035ccaa6ad46134d9b7c042e2249.gz --- src/edu/berkeley/sbp/Parser.java | 19 +++++++++++-------- src/edu/berkeley/sbp/misc/CharRange.java | 6 +++--- src/edu/berkeley/sbp/misc/CharToStringParser.java | 5 ++++- src/edu/berkeley/sbp/misc/CharToken.java | 10 +++++++--- src/edu/berkeley/sbp/util/TopologicalBag.java | 8 +++----- 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 3bafbfe..60da9e4 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -8,11 +8,11 @@ import java.util.*; /** a parser which translates streams of Tokens of type T into a Forest */ public abstract class Parser { - private final Table pt; + protected final Table pt; /** create a parser to parse the grammar with start symbol u */ protected Parser(Union u, Topology top) { this.pt = new Table(u, top); } - protected Parser(Table pt) { this.pt = pt; } + protected Parser(Table pt) { this.pt = pt; } /** implement this method to create the output forest corresponding to a lone shifted input token */ public abstract Forest shiftToken(Tok t, Token.Location loc); @@ -38,10 +38,17 @@ public abstract class Parser { // Table ////////////////////////////////////////////////////////////////////////////// /** an SLR(1) parse table which may contain conflicts */ - static class Table extends Walk.Cache { + public 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; @@ -59,6 +66,7 @@ public abstract class Parser { /** used to generate unique values for State.idx */ private int master_state_idx = 0; + HashMap,State> all_states = new HashMap,State>(); /** construct a parse table for the given grammar */ public Table(Topology top) { this("s", top); } @@ -71,7 +79,6 @@ public abstract class Parser { cache.eof.put(start0, true); // construct the set of states - HashMap,State> all_states = new HashMap,State>(); HashSet all_elements = new HashSet(); walk(start0, all_elements); for(Element e : all_elements) @@ -102,10 +109,6 @@ public abstract class Parser { if (p.element() != null && p.element() instanceof Atom) state.shifts.addAll(state.gotoSetTerminals.subset(((Atom)p.element()))); } - for(State state : all_states.values()) { - state.oreductions = state.reductions.optimize(); - state.oshifts = state.shifts.optimize(); - } } private boolean isRightNullable(Position p) { diff --git a/src/edu/berkeley/sbp/misc/CharRange.java b/src/edu/berkeley/sbp/misc/CharRange.java index 59ee325..5a1c24c 100644 --- a/src/edu/berkeley/sbp/misc/CharRange.java +++ b/src/edu/berkeley/sbp/misc/CharRange.java @@ -36,7 +36,7 @@ public class CharRange extends Atom { } public static final Atom leftBrace = CharToken.leftBrace; public static final Atom rightBrace = CharToken.rightBrace; - public static Atom set(Range.Set r) { return new CharRange(new IntegerTopology(null, r)); } + public static Atom set(Range.Set r) { return new CharRange(new IntegerTopology(CharToken.c2i, r)); } private static final Range.Set all = new Range.Set(new Range(0, Character.MAX_VALUE)); /** returns an element which exactly matches the string given */ @@ -46,13 +46,13 @@ public class CharRange extends Atom { Element ret; if (s.length() == 1) { ret = - new CharRange(new IntegerTopology(null, (int)s.charAt(0))) { + new CharRange(new IntegerTopology(CharToken.c2i, (int)s.charAt(0))) { public String toString() { return escapified; } }; } else { Union ret2 = new Union("\""+s+"\"_str", true) { public String toString() { return escapified; } }; Element[] refs = new Element[s.length()]; - for(int i=0; i(null, (int)s.charAt(i))); + for(int i=0; i(CharToken.c2i, (int)s.charAt(i))); ret2.add(Sequence.constant(refs, s, null, null)); ret = ret2; } diff --git a/src/edu/berkeley/sbp/misc/CharToStringParser.java b/src/edu/berkeley/sbp/misc/CharToStringParser.java index c66ff5d..f4395b9 100644 --- a/src/edu/berkeley/sbp/misc/CharToStringParser.java +++ b/src/edu/berkeley/sbp/misc/CharToStringParser.java @@ -15,7 +15,10 @@ public class CharToStringParser extends Parser { return super.parse(new Stream(r)); } - public CharToStringParser(Union u) { super(u, new IntegerTopology(null)); } + public CharToStringParser(Union u) { + super(u, new IntegerTopology(CharToken.c2i)); + pt.optimize(CharToken.c2i); + } public Forest shiftToken(CharToken ct, Location loc) { return Forest.create(loc, ct.result(), null, false, false); } diff --git a/src/edu/berkeley/sbp/misc/CharToken.java b/src/edu/berkeley/sbp/misc/CharToken.java index eafe882..580e851 100644 --- a/src/edu/berkeley/sbp/misc/CharToken.java +++ b/src/edu/berkeley/sbp/misc/CharToken.java @@ -8,10 +8,14 @@ import edu.berkeley.sbp.Token.Location; import edu.berkeley.sbp.util.*; /** an implementation of Token for streams of Java char values */ -public class CharToken implements IntegerMappable { +public class CharToken { - public static final Atom leftBrace = new CharRange(new IntegerTopology(null, 9998)) { public String toString() { return "{"; } }; - public static final Atom rightBrace = new CharRange(new IntegerTopology(null, 9999)) { public String toString() { return "}"; } }; + public static final Functor c2i = new Functor() { + public Integer invoke(CharToken c) { return new Integer(c.c); } + }; + + public static final Atom leftBrace = new CharRange(new IntegerTopology(c2i, 9998)) { public String toString() { return "{"; } }; + public static final Atom rightBrace = new CharRange(new IntegerTopology(c2i, 9999)) { public String toString() { return "}"; } }; public static final CharToken left = new CharToken((char)9998); public static final CharToken right = new CharToken((char)9999); diff --git a/src/edu/berkeley/sbp/util/TopologicalBag.java b/src/edu/berkeley/sbp/util/TopologicalBag.java index 9a18eef..2595602 100644 --- a/src/edu/berkeley/sbp/util/TopologicalBag.java +++ b/src/edu/berkeley/sbp/util/TopologicalBag.java @@ -135,7 +135,7 @@ public class TopologicalBag implements MapBag,V>, VisitableMap< } } - public VisitableMap optimize() { + public VisitableMap optimize(final Functor f) { ArrayList min_ = new ArrayList(); ArrayList max_ = new ArrayList(); ArrayList v_ = new ArrayList(); @@ -157,16 +157,14 @@ public class TopologicalBag implements MapBag,V>, VisitableMap< final Object[][] v = new Object[size][]; v_.toArray(v); return new VisitableMap() { public boolean contains(K k) { - IntegerMappable im = (IntegerMappable)k; - int asint = im.toInt(); + int asint = f.invoke(k); for(int i=0; i= asint && v[i].length > 0) return true; return false; } public void invoke(K k, Invokable ivbc, B b, C c) { - IntegerMappable im = (IntegerMappable)k; - int asint = im.toInt(); + int asint = f.invoke(k); for(int i=0; i= asint) { Object[] arr = v[i]; -- 1.7.10.4