From 61a641445b4f0916427804a6168b87fcde977abf Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 15 Jan 2006 04:15:30 -0500 Subject: [PATCH] checkpoint darcs-hash:20060115091530-5007d-035f0ed02d39916e0194ceab570fff29cab28f93.gz --- src/edu/berkeley/sbp/misc/CharRange.java | 9 +-- src/edu/berkeley/sbp/misc/CharToStringParser.java | 28 ++++++++- src/edu/berkeley/sbp/misc/CharToken.java | 28 +-------- src/edu/berkeley/sbp/util/IntegerTopology.java | 65 ++++++--------------- 4 files changed, 51 insertions(+), 79 deletions(-) diff --git a/src/edu/berkeley/sbp/misc/CharRange.java b/src/edu/berkeley/sbp/misc/CharRange.java index 932fbd6..59ee325 100644 --- a/src/edu/berkeley/sbp/misc/CharRange.java +++ b/src/edu/berkeley/sbp/misc/CharRange.java @@ -20,7 +20,7 @@ public class CharRange extends Atom { sb.append('~'); ranges = ranges.complement(); } - ranges = ranges.intersect(CharToken.all); + ranges = ranges.intersect(all); for(Range r : ranges) { if (r.isMinNegInf() || r.isMaxPosInf()) throw new Error("should not happen"); if (r.getMin()==r.getMax()) { @@ -36,7 +36,8 @@ 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(r)); } + public static Atom set(Range.Set r) { return new CharRange(new IntegerTopology(null, 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 */ public static Element string(String s) { @@ -45,13 +46,13 @@ public class CharRange extends Atom { Element ret; if (s.length() == 1) { ret = - new CharRange(new IntegerTopology((int)s.charAt(0))) { + new CharRange(new IntegerTopology(null, (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((int)s.charAt(i))); + for(int i=0; i(null, (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 802d689..c66ff5d 100644 --- a/src/edu/berkeley/sbp/misc/CharToStringParser.java +++ b/src/edu/berkeley/sbp/misc/CharToStringParser.java @@ -8,14 +8,36 @@ import edu.berkeley.sbp.Token.Location; import edu.berkeley.sbp.util.*; public class CharToStringParser extends Parser { - public CharToStringParser(Union u) { super(u, new IntegerTopology()); } public Forest parse(InputStream is) throws IOException, ParseFailed { - return super.parse(new CharToken.Stream(is)); + return super.parse(new Stream(is)); } public Forest parse(Reader r) throws IOException, ParseFailed { - return super.parse(new CharToken.Stream(r)); + return super.parse(new Stream(r)); } + + public CharToStringParser(Union u) { super(u, new IntegerTopology(null)); } public Forest shiftToken(CharToken ct, Location loc) { return Forest.create(loc, ct.result(), 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 CharToken next() throws IOException { + cr = false; + int i = r.read(); + if (i==-1) return null; + char c = (char)i; + cr = c=='\n'; + return new CharToken(c); + } + } } diff --git a/src/edu/berkeley/sbp/misc/CharToken.java b/src/edu/berkeley/sbp/misc/CharToken.java index 49d4dea..eafe882 100644 --- a/src/edu/berkeley/sbp/misc/CharToken.java +++ b/src/edu/berkeley/sbp/misc/CharToken.java @@ -10,15 +10,11 @@ import edu.berkeley.sbp.util.*; /** an implementation of Token for streams of Java char values */ public class CharToken implements IntegerMappable { - public static final Atom leftBrace = new CharRange(new IntegerTopology(9998)) { public String toString() { return "{"; } }; - public static final Atom rightBrace = new CharRange(new IntegerTopology(9999)) { public String toString() { return "}"; } }; + 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 CharToken left = new CharToken((char)9998); public static final CharToken right = new CharToken((char)9999); - static final Range.Set all = new Range.Set(new Range(0, Character.MAX_VALUE)); - public static final Atom any = new CharRange(new IntegerTopology(all)); - public static final Atom none = new CharRange(new IntegerTopology()); - // Private ////////////////////////////////////////////////////////////////////////////// public final char c; @@ -30,24 +26,4 @@ public class CharToken implements IntegerMappable { public int toInt() { return (int)c; } - public 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 CharToken next() throws IOException { - cr = false; - int i = r.read(); - if (i==-1) return null; - char c = (char)i; - cr = c=='\n'; - return new CharToken(c); - } - } } diff --git a/src/edu/berkeley/sbp/util/IntegerTopology.java b/src/edu/berkeley/sbp/util/IntegerTopology.java index e82ce73..ae99c08 100644 --- a/src/edu/berkeley/sbp/util/IntegerTopology.java +++ b/src/edu/berkeley/sbp/util/IntegerTopology.java @@ -3,33 +3,36 @@ import java.io.*; import java.util.*; import java.lang.reflect.*; import java.lang.ref.*; -import edu.berkeley.sbp.util.*; import edu.berkeley.sbp.*; +import edu.berkeley.sbp.util.*; /** implementation of Topology for any class for which there is a mapping to the ints */ -public class IntegerTopology implements Topology { +public class IntegerTopology implements Topology { + private final Range.Set rs; + private final Functor f; - private static final IntegerTopology empty = new IntegerTopology(); + private int toInt(V v) { return f==null?((IntegerMappable)v).toInt():f.invoke(v); } public Range.Set getRanges() { return new Range.Set(rs); } - public IntegerTopology() { this(new Range.Set()); } - public IntegerTopology(V v) { this(v.toInt()); } - public IntegerTopology(V a, V b) { this(a.toInt(), b.toInt()); } - public IntegerTopology(int a) { this(a, a); } - public IntegerTopology(int a, int b) { this(new Range(a, b)); } - public IntegerTopology(Range r) { this(new Range.Set(r)); } - public IntegerTopology(Range.Set rs) { this.rs = rs; } + 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)); } + public IntegerTopology(Functor f, V a, V b) { this(f, f==null?((IntegerMappable)a).toInt():f.invoke(a), + f==null?((IntegerMappable)b).toInt():f.invoke(b)); } + public IntegerTopology(Functor f, int a) { this(f, a, a); } + public IntegerTopology(Functor f, int a, int b) { this(f, new Range(a, b)); } + public IntegerTopology(Functor f, Range r) { this(f, new Range.Set(r)); } + public IntegerTopology(Functor f, Range.Set rs) { this.rs = rs; this.f = f; } - public Topology empty() { return (Topology)empty; } + public Topology empty() { return new IntegerTopology(f); } - public boolean contains(V v) { return rs.contains(v.toInt()); } + public boolean contains(V v) { return rs.contains(toInt(v)); } - public Topology complement() { return new IntegerTopology(rs.complement()); } - public Topology intersect(Topology t) { return new IntegerTopology(rs.intersect(((IntegerTopology)t.unwrap()).rs)); } - public Topology minus(Topology t) { return new IntegerTopology(rs.intersect(((IntegerTopology)t.unwrap()).rs.complement())); } - public Topology union(Topology t) { return new IntegerTopology(rs.union(((IntegerTopology)t.unwrap()).rs)); } + public Topology complement() { return new IntegerTopology(f, rs.complement()); } + public Topology intersect(Topology t) { return new IntegerTopology(f, rs.intersect(((IntegerTopology)t.unwrap()).rs)); } + public Topology minus(Topology t) { return new IntegerTopology(f, rs.intersect(((IntegerTopology)t.unwrap()).rs.complement())); } + public Topology union(Topology t) { return new IntegerTopology(f, rs.union(((IntegerTopology)t.unwrap()).rs)); } public boolean disjoint(Topology t) { return rs.intersect(((IntegerTopology)t.unwrap()).rs).size()==0; } public boolean containsAll(Topology t) { return rs.containsAll(((IntegerTopology)t.unwrap()).rs); } @@ -37,34 +40,4 @@ public class IntegerTopology implements Topology { public int hashCode() { return rs.hashCode(); } public boolean equals(Object o) { return o!=null && o instanceof IntegerTopology && ((IntegerTopology)o).rs.equals(rs); } - // FIXME: this is currently char-range specific - /* - public String toString() { - String classname = this.getClass().getName().replace('$', '.'); - if (rs==null) return "new " + classname + "()"; - StringBuffer sb = new StringBuffer(); - sb.append("new "); - sb.append(classname); - sb.append("(new Range.Set(new Range[] { "); - for(Range r : rs) { - sb.append("new Range("); - if (r.isMinNegInf() && r.isMaxPosInf()) { - sb.append("true, true"); - } else if (r.isMinNegInf()) { - sb.append("true, "); - sb.append(r.getMax()); - } else if (r.isMaxPosInf()) { - sb.append(r.getMin()); - sb.append(", true"); - } else { - sb.append(r.getMin()); - sb.append(", "); - sb.append(r.getMax()); - } - sb.append(")"); - } - sb.append("new Range() }))"); - return sb.toString(); - } - */ } -- 1.7.10.4