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()) {
}
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>(r)); }
+ public static Atom set(Range.Set r) { return new CharRange(new IntegerTopology<CharToken>(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) {
Element ret;
if (s.length() == 1) {
ret =
- new CharRange(new IntegerTopology<CharToken>((int)s.charAt(0))) {
+ new CharRange(new IntegerTopology<CharToken>(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<refs.length; i++) refs[i] = new CharRange(new IntegerTopology<CharToken>((int)s.charAt(i)));
+ for(int i=0; i<refs.length; i++) refs[i] = new CharRange(new IntegerTopology<CharToken>(null, (int)s.charAt(i)));
ret2.add(Sequence.constant(refs, s, null, null));
ret = ret2;
}
import edu.berkeley.sbp.util.*;
public class CharToStringParser extends Parser<CharToken,String> {
- public CharToStringParser(Union u) { super(u, new IntegerTopology<CharToken>()); }
public Forest<String> parse(InputStream is) throws IOException, ParseFailed {
- return super.parse(new CharToken.Stream(is));
+ return super.parse(new Stream(is));
}
public Forest<String> 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<CharToken>(null)); }
public Forest<String> shiftToken(CharToken ct, Location loc) {
return Forest.create(loc, ct.result(), null, false, false);
}
+
+ private static class Stream extends CartesianInput<CharToken> {
+ 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);
+ }
+ }
}
/** an implementation of Token for streams of Java <tt>char</tt> values */
public class CharToken implements IntegerMappable {
- public static final Atom leftBrace = new CharRange(new IntegerTopology<CharToken>(9998)) { public String toString() { return "{"; } };
- public static final Atom rightBrace = new CharRange(new IntegerTopology<CharToken>(9999)) { public String toString() { return "}"; } };
+ 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 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<CharToken>(all));
- public static final Atom none = new CharRange(new IntegerTopology<CharToken>());
-
// Private //////////////////////////////////////////////////////////////////////////////
public final char c;
public int toInt() { return (int)c; }
- public static class Stream extends CartesianInput<CharToken> {
- 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);
- }
- }
}
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 <tt>Topology</tt> for any class for which there is a mapping to the <tt>int</tt>s */
-public class IntegerTopology<V extends IntegerMappable> implements Topology<V> {
+public class IntegerTopology<V> implements Topology<V> {
+
private final Range.Set rs;
+ private final Functor<V,Integer> 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<V,Integer> f) { this(f, new Range.Set()); }
+ public IntegerTopology(Functor<V,Integer> f, V a) { this(f, f==null?((IntegerMappable)a).toInt():f.invoke(a)); }
+ public IntegerTopology(Functor<V,Integer> 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<V,Integer> f, int a) { this(f, a, a); }
+ public IntegerTopology(Functor<V,Integer> f, int a, int b) { this(f, new Range(a, b)); }
+ public IntegerTopology(Functor<V,Integer> f, Range r) { this(f, new Range.Set(r)); }
+ public IntegerTopology(Functor<V,Integer> f, Range.Set rs) { this.rs = rs; this.f = f; }
- public Topology<V> empty() { return (Topology<V>)empty; }
+ public Topology<V> empty() { return new IntegerTopology<V>(f); }
- public boolean contains(V v) { return rs.contains(v.toInt()); }
+ public boolean contains(V v) { return rs.contains(toInt(v)); }
- public Topology<V> complement() { return new IntegerTopology<V>(rs.complement()); }
- public Topology<V> intersect(Topology<V> t) { return new IntegerTopology<V>(rs.intersect(((IntegerTopology<V>)t.unwrap()).rs)); }
- public Topology<V> minus(Topology<V> t) { return new IntegerTopology<V>(rs.intersect(((IntegerTopology<V>)t.unwrap()).rs.complement())); }
- public Topology<V> union(Topology<V> t) { return new IntegerTopology<V>(rs.union(((IntegerTopology<V>)t.unwrap()).rs)); }
+ public Topology<V> complement() { return new IntegerTopology<V>(f, rs.complement()); }
+ public Topology<V> intersect(Topology<V> t) { return new IntegerTopology<V>(f, rs.intersect(((IntegerTopology<V>)t.unwrap()).rs)); }
+ public Topology<V> minus(Topology<V> t) { return new IntegerTopology<V>(f, rs.intersect(((IntegerTopology<V>)t.unwrap()).rs.complement())); }
+ public Topology<V> union(Topology<V> t) { return new IntegerTopology<V>(f, rs.union(((IntegerTopology<V>)t.unwrap()).rs)); }
public boolean disjoint(Topology<V> t) { return rs.intersect(((IntegerTopology<V>)t.unwrap()).rs).size()==0; }
public boolean containsAll(Topology<V> t) { return rs.containsAll(((IntegerTopology<V>)t.unwrap()).rs); }
public int hashCode() { return rs.hashCode(); }
public boolean equals(Object o) { return o!=null && o instanceof IntegerTopology && ((IntegerTopology<V>)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();
- }
- */
}