[e-cvs] cvs commit: e/src/jsrc/org/quasiliteral/term SimpleTermBuilder.java
markm@eros.cs.jhu.edu
markm@eros.cs.jhu.edu
Sat, 3 Nov 2001 22:12:59 -0500
markm 01/11/03 22:12:59
Added: src/jsrc/org/quasiliteral/term SimpleTermBuilder.java
Log:
forgot this one
Revision Changes Path
1.1 e/src/jsrc/org/quasiliteral/term/SimpleTermBuilder.java
Index: SimpleTermBuilder.java
===================================================================
package org.quasiliteral.term;
import org.erights.e.elib.tables.ConstList;
import org.erights.e.elib.tables.Twine;
import org.quasiliteral.astro.AstroToken;
/**
* Used by the actions of term.y / TermParser.
* <p>
* XXX TermBuilder, TermParser, term.y, and TermLexer are all to be replaced
* with Antlr-based equivalents.
*
* @author <a href="mailto:markm@caplet.com">Mark S Miller</a>
*/
public class SimpleTermBuilder implements TermBuilder {
static public final SimpleTermBuilder THE_ONE = new SimpleTermBuilder();
/**
*
*/
private SimpleTermBuilder() {}
/**
*
*/
public Object list() {
return ConstList.EmptyList;
}
/**
*
*/
public Object list(Object elem0) {
return ConstList.EmptyList.with(elem0);
}
/**
*
*/
public Object with(Object sofar, Object next) {
return ((ConstList)sofar).with(next);
}
/**
*
*/
public Object term(Object fnctr, Object args) {
return new Term(asFunctor(fnctr), (ConstList)args);
}
/**
*
*/
public Object functor(Object ttype, Object src, Object optValue) {
return new Functor(asString(ttype),
asTwine(src),
asOptValue(optValue));
}
/**
*
*/
public Object dollarHole(Object index) {
throw new RuntimeException("SimpleTermBuilder doesn't allow holes");
}
/**
*
*/
public Object atHole(Object index) {
throw new RuntimeException("SimpleTermBuilder doesn't allow holes");
}
/**
*
*/
public Object repr(Object hole, Object howMany) {
throw new RuntimeException("SimpleTermBuilder doesn't allow holes");
}
/**
*
*/
private Functor asFunctor(Object f) {
if (f instanceof Functor) {
return (Functor)f;
} else if (f instanceof String) {
//XXX should check that it's a valid identifier
String str = (String)f;
return new Functor(str, Twine.fromString(str), null);
} else if (f instanceof Twine) {
//XXX should check that it's a valid identifier
Twine twine = (Twine)f;
return new Functor(twine.bare(), twine, null);
} else if (f instanceof AstroToken) {
AstroToken tok = (AstroToken)f;
return tok.asFunctor(TermParser.getTokenNames());
} else {
throw new RuntimeException("isn't like a Functor: " + f);
}
}
/**
*
*/
private Object extract(AstroToken tok) {
Object result = tok.getOptValue();
if (result != null) {
return result;
} else {
return tok.getSource();
}
}
/**
*
*/
private String asString(Object s) {
if (s instanceof String) {
return (String)s;
} else if (s instanceof Twine) {
return ((Twine)s).bare();
} else if (s instanceof AstroToken) {
return asString(extract((AstroToken)s));
} else {
throw new RuntimeException("isn't like a String: " + s);
}
}
/**
*
*/
private Twine asTwine(Object t) {
if (t instanceof Twine) {
return (Twine)t;
} else if (t instanceof String) {
return Twine.fromString((String)t);
} else if (t instanceof AstroToken) {
return asTwine(extract((AstroToken)t));
} else {
throw new RuntimeException("isn't like a Twine: " + t);
}
}
/**
*
*/
private Object asOptValue(Object v) {
if (null == v) {
return null;
} else if (v instanceof AstroToken) {
return extract((AstroToken)v);
} else {
throw new RuntimeException("can't extract value from: " + v);
}
}
}