/** a parser which translates streams of Tokens of type T into a Forest<R> */
public abstract class Parser<Tok, Result> {
- private final Table pt;
+ protected final Table<Tok> pt;
/** create a parser to parse the grammar with start symbol <tt>u</tt> */
protected Parser(Union u, Topology<Tok> top) { this.pt = new Table<Tok>(u, top); }
- protected Parser(Table pt) { this.pt = pt; }
+ protected Parser(Table<Tok> pt) { this.pt = pt; }
/** implement this method to create the output forest corresponding to a lone shifted input token */
public abstract Forest<Result> shiftToken(Tok t, Token.Location loc);
// Table //////////////////////////////////////////////////////////////////////////////
/** an SLR(1) parse table which may contain conflicts */
- static class Table<Tok> extends Walk.Cache {
+ public static class Table<Tok> extends Walk.Cache {
public final Walk.Cache cache = this;
+ public void optimize(Functor<Tok,Integer> f) {
+ for(State<Tok> state : all_states.values()) {
+ state.oreductions = state.reductions.optimize(f);
+ state.oshifts = state.shifts.optimize(f);
+ }
+ }
+
private void walk(Element e, HashSet<Element> hs) {
if (e==null) return;
if (hs.contains(e)) return;
/** used to generate unique values for State.idx */
private int master_state_idx = 0;
+ HashMap<HashSet<Position>,State<Tok>> all_states = new HashMap<HashSet<Position>,State<Tok>>();
/** construct a parse table for the given grammar */
public Table(Topology top) { this("s", top); }
cache.eof.put(start0, true);
// construct the set of states
- HashMap<HashSet<Position>,State<Tok>> all_states = new HashMap<HashSet<Position>,State<Tok>>();
HashSet<Element> all_elements = new HashSet<Element>();
walk(start0, all_elements);
for(Element e : all_elements)
if (p.element() != null && p.element() instanceof Atom)
state.shifts.addAll(state.gotoSetTerminals.subset(((Atom)p.element())));
}
- for(State<Tok> state : all_states.values()) {
- state.oreductions = state.reductions.optimize();
- state.oshifts = state.shifts.optimize();
- }
}
private boolean isRightNullable(Position p) {
}
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<CharToken>(null, r)); }
+ public static Atom set(Range.Set r) { return new CharRange(new IntegerTopology<CharToken>(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 */
Element ret;
if (s.length() == 1) {
ret =
- new CharRange(new IntegerTopology<CharToken>(null, (int)s.charAt(0))) {
+ new CharRange(new IntegerTopology<CharToken>(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<refs.length; i++) refs[i] = new CharRange(new IntegerTopology<CharToken>(null, (int)s.charAt(i)));
+ for(int i=0; i<refs.length; i++) refs[i] = new CharRange(new IntegerTopology<CharToken>(CharToken.c2i, (int)s.charAt(i)));
ret2.add(Sequence.constant(refs, s, null, null));
ret = ret2;
}
return super.parse(new Stream(r));
}
- public CharToStringParser(Union u) { super(u, new IntegerTopology<CharToken>(null)); }
+ public CharToStringParser(Union u) {
+ super(u, new IntegerTopology<CharToken>(CharToken.c2i));
+ pt.optimize(CharToken.c2i);
+ }
public Forest<String> shiftToken(CharToken ct, Location loc) {
return Forest.create(loc, ct.result(), null, false, false);
}
import edu.berkeley.sbp.util.*;
/** an implementation of Token for streams of Java <tt>char</tt> values */
-public class CharToken implements IntegerMappable {
+public class CharToken {
- public static final Atom leftBrace = new CharRange(new IntegerTopology<CharToken>(null, 9998)) { public String toString() { return "{"; } };
- public static final Atom rightBrace = new CharRange(new IntegerTopology<CharToken>(null, 9999)) { public String toString() { return "}"; } };
+ public static final Functor<CharToken,Integer> c2i = new Functor<CharToken,Integer>() {
+ public Integer invoke(CharToken c) { return new Integer(c.c); }
+ };
+
+ public static final Atom leftBrace = new CharRange(new IntegerTopology<CharToken>(c2i, 9998)) { public String toString() { return "{"; } };
+ public static final Atom rightBrace = new CharRange(new IntegerTopology<CharToken>(c2i, 9999)) { public String toString() { return "}"; } };
public static final CharToken left = new CharToken((char)9998);
public static final CharToken right = new CharToken((char)9999);
}
}
- public VisitableMap<K,V> optimize() {
+ public VisitableMap<K,V> optimize(final Functor<K,Integer> f) {
ArrayList<Long> min_ = new ArrayList<Long>();
ArrayList<Long> max_ = new ArrayList<Long>();
ArrayList<Object[]> v_ = new ArrayList<Object[]>();
final Object[][] v = new Object[size][]; v_.toArray(v);
return new VisitableMap<K,V>() {
public boolean contains(K k) {
- IntegerMappable im = (IntegerMappable)k;
- int asint = im.toInt();
+ int asint = f.invoke(k);
for(int i=0; i<size; i++)
if (min[i] <= asint && max[i] >= asint && v[i].length > 0)
return true;
return false;
}
public <B,C> void invoke(K k, Invokable<V,B,C> ivbc, B b, C c) {
- IntegerMappable im = (IntegerMappable)k;
- int asint = im.toInt();
+ int asint = f.invoke(k);
for(int i=0; i<size; i++) {
if (min[i] <= asint && max[i] >= asint) {
Object[] arr = v[i];