From c7af09d552a9cf2d53a72baa975c9a73384813ea Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 15 Jan 2006 06:11:35 -0500 Subject: [PATCH] checkpoint darcs-hash:20060115111135-5007d-b37831cc7c89c8151a48f062e3d8a0be5ee4cbc9.gz --- src/edu/berkeley/sbp/Input.java | 11 ++++--- src/edu/berkeley/sbp/Parser.java | 12 ++++---- src/edu/berkeley/sbp/chr/CharInput.java | 30 +++++++++++++++++++ src/edu/berkeley/sbp/chr/CharParser.java | 35 ++++------------------ src/edu/berkeley/sbp/misc/CartesianInput.java | 7 ----- src/edu/berkeley/sbp/misc/CartesianLocation.java | 14 +++++++++ src/edu/berkeley/sbp/tib/Tib.java | 2 +- src/edu/berkeley/sbp/util/IntegerTopology.java | 1 + 8 files changed, 63 insertions(+), 49 deletions(-) create mode 100644 src/edu/berkeley/sbp/chr/CharInput.java create mode 100644 src/edu/berkeley/sbp/misc/CartesianLocation.java diff --git a/src/edu/berkeley/sbp/Input.java b/src/edu/berkeley/sbp/Input.java index d8374cd..a2c9baa 100644 --- a/src/edu/berkeley/sbp/Input.java +++ b/src/edu/berkeley/sbp/Input.java @@ -6,11 +6,14 @@ import java.lang.ref.*; import edu.berkeley.sbp.*; import edu.berkeley.sbp.util.*; -/** a token of input -- note that this represents an actual input token rather than an Element which matches a token */ -public interface Input { +/** a stream of tokens to be parsed */ +public interface Input { - public Tok next(int numstates, int resets, int waits) throws IOException; - public abstract Location getLocation(); + /** returns the token just beyond the current location and advances beyond it */ + public Token next(int numstates, int resets, int waits) throws IOException; + + /** returns the location the input stream is currently at */ + public Location getLocation(); /** a location *between tokens* in the input stream */ public static interface Location { diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 75f3ace..632729e 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -42,13 +42,6 @@ public abstract class Parser { 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; @@ -109,6 +102,11 @@ 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) { diff --git a/src/edu/berkeley/sbp/chr/CharInput.java b/src/edu/berkeley/sbp/chr/CharInput.java new file mode 100644 index 0000000..1178e42 --- /dev/null +++ b/src/edu/berkeley/sbp/chr/CharInput.java @@ -0,0 +1,30 @@ +package edu.berkeley.sbp.chr; +import java.io.*; +import java.util.*; +import java.lang.reflect.*; +import java.lang.ref.*; +import edu.berkeley.sbp.*; +import edu.berkeley.sbp.util.*; +import edu.berkeley.sbp.misc.*; +import edu.berkeley.sbp.Input.Location; + +public class CharInput extends CartesianInput { + private final Reader r; + + public CharInput(String s) { this(new StringReader(s)); } + public CharInput(Reader r) { this(r, null); } + public CharInput(Reader r, String s) { this.r = r; } + public CharInput(InputStream i) { this(i, null); } + public CharInput(InputStream i, String s) { this(new InputStreamReader(i), s); } + + boolean cr = false; + public boolean isCR() { return cr; } + public Character next() throws IOException { + cr = false; + int i = r.read(); + if (i==-1) return null; + char c = (char)i; + cr = c=='\n'; + return c; + } +} diff --git a/src/edu/berkeley/sbp/chr/CharParser.java b/src/edu/berkeley/sbp/chr/CharParser.java index db235cd..6ad2a7e 100644 --- a/src/edu/berkeley/sbp/chr/CharParser.java +++ b/src/edu/berkeley/sbp/chr/CharParser.java @@ -9,39 +9,14 @@ import edu.berkeley.sbp.misc.*; import edu.berkeley.sbp.Input.Location; public class CharParser extends Parser { - public Forest parse(InputStream is) throws IOException, ParseFailed { - return super.parse(new Stream(is)); - } - public Forest parse(Reader r) throws IOException, ParseFailed { - return super.parse(new Stream(r)); - } - public CharParser(Union u) { - super(u, new CharTopology()); - pt.optimize(new CharTopology()); - } + public Forest parse(InputStream is) throws IOException, ParseFailed { return super.parse(new CharInput(is)); } + public Forest parse(Reader r) throws IOException, ParseFailed { return super.parse(new CharInput(r)); } + + public CharParser(Union u) { super(u, new CharTopology()); } + public Forest shiftToken(Character ct, Location loc) { return Forest.create(loc, ct.toString(), null, false, false); } - private static class Stream extends CartesianInput { - private final Reader r; - - public Stream(String s) { this(new StringReader(s)); } - public Stream(Reader r) { this(r, null); } - public Stream(Reader r, String s) { this.r = r; } - public Stream(InputStream i) { this(i, null); } - public Stream(InputStream i, String s) { this(new InputStreamReader(i), s); } - - boolean cr = false; - public boolean isCR() { return cr; } - public Character next() throws IOException { - cr = false; - int i = r.read(); - if (i==-1) return null; - char c = (char)i; - cr = c=='\n'; - return c; - } - } } diff --git a/src/edu/berkeley/sbp/misc/CartesianInput.java b/src/edu/berkeley/sbp/misc/CartesianInput.java index 4930173..928b236 100644 --- a/src/edu/berkeley/sbp/misc/CartesianInput.java +++ b/src/edu/berkeley/sbp/misc/CartesianInput.java @@ -39,13 +39,6 @@ public abstract class CartesianInput implements Input { return t; } - public static class Location implements Input.Location { - public final int line; - public final int col; - public String toString() { return line + ":" + col; } - public Location(int line, int col) { this.line = line; this.col = col; } - } - private class LocWrap implements Input.Location { public final int line; public final int col; diff --git a/src/edu/berkeley/sbp/misc/CartesianLocation.java b/src/edu/berkeley/sbp/misc/CartesianLocation.java new file mode 100644 index 0000000..b5d7bb7 --- /dev/null +++ b/src/edu/berkeley/sbp/misc/CartesianLocation.java @@ -0,0 +1,14 @@ +package edu.berkeley.sbp.misc; +import java.io.*; +import java.util.*; +import java.lang.reflect.*; +import java.lang.ref.*; +import edu.berkeley.sbp.*; +import edu.berkeley.sbp.util.*; + +public class CartesianLocation implements Input.Location { + public final int line; + public final int col; + public String toString() { return line + ":" + col; } + public CartesianLocation(int line, int col) { this.line = line; this.col = col; } +} diff --git a/src/edu/berkeley/sbp/tib/Tib.java b/src/edu/berkeley/sbp/tib/Tib.java index 6693600..b2383ac 100644 --- a/src/edu/berkeley/sbp/tib/Tib.java +++ b/src/edu/berkeley/sbp/tib/Tib.java @@ -42,7 +42,7 @@ public class Tib implements Input { int _row = 1; int _col = 0; - public Input.Location getLocation() { return new CartesianInput.Location(_row, _col); } + public Input.Location getLocation() { return new CartesianLocation(_row, _col); } private BufferedReader br; char left = CharRange.left; diff --git a/src/edu/berkeley/sbp/util/IntegerTopology.java b/src/edu/berkeley/sbp/util/IntegerTopology.java index 71e9df9..73de988 100644 --- a/src/edu/berkeley/sbp/util/IntegerTopology.java +++ b/src/edu/berkeley/sbp/util/IntegerTopology.java @@ -15,6 +15,7 @@ public class IntegerTopology implements Topology { private int toInt(V v) { return f==null?((IntegerMappable)v).toInt():f.invoke(v); } public Range.Set getRanges() { return new Range.Set(rs); } + public Functor functor() { return f; } public IntegerTopology(Functor f) { this(f, new Range.Set()); } public IntegerTopology(Functor f, V a) { this(f, f==null?((IntegerMappable)a).toInt():f.invoke(a)); } -- 1.7.10.4