[e-cvs] cvs commit: e/src/jsrc/org/quasiliteral/term Functor.java SimpleTermBuilder.java Term.java Term.updoc TermBuilder.java TermLexer.java TermParser.java term.y
markm@eros.cs.jhu.edu
markm@eros.cs.jhu.edu
Mon, 19 Nov 2001 14:15:36 -0500
markm 01/11/19 14:15:35
Modified: src Makefile
src/csrc/setup e-template.txt
src/jsrc/net/captp/jcomm SturdyRef.java
src/jsrc/org/erights/e/elang/interp ScopeSetup.java
src/jsrc/org/erights/e/elib/quasi MatchMaker.java
ValueMaker.java
src/jsrc/org/erights/e/elib/tables ConstList.java
ConstMap.java ConstSet.java Twine.java
src/jsrc/org/quasiliteral/term Functor.java
SimpleTermBuilder.java Term.java Term.updoc
TermBuilder.java TermLexer.java TermParser.java
term.y
Log:
quasi term trees are starting to work
Revision Changes Path
1.124 +1 -0 e/src/Makefile
Index: Makefile
===================================================================
RCS file: /cvs/e/src/Makefile,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -r1.123 -r1.124
--- Makefile 2001/11/17 18:25:54 1.123
+++ Makefile 2001/11/19 19:15:34 1.124
@@ -39,6 +39,7 @@
mkdir --parents $(TOP)/export/e
cp -rf $(TOP)/dist $(TOP)/export/dist
cp -rf $(TOP)/src $(TOP)/export/e/src
+ -rm -rf $(TOP)/export/e/src/ePrograms
-rm -rf `find $(TOP)/export -name CVS`
-rm -rf `find $(TOP)/export -name makeout`
-rm -rf `find $(TOP)/export -name cvsout`
1.9 +43 -10 e/src/csrc/setup/e-template.txt
Index: e-template.txt
===================================================================
RCS file: /cvs/e/src/csrc/setup/e-template.txt,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- e-template.txt 2001/08/26 01:21:30 1.8
+++ e-template.txt 2001/11/19 19:15:34 1.9
@@ -1,5 +1,7 @@
#!/bin/bash
+# This file is hereby placed in the public domain.
+
# E Driver Script (or E Driver Script Template)
#
# If you are looking at "e-template.txt", then you are looking at a
@@ -22,11 +24,12 @@
# complete documentation.
#
# @author Mark S. Miller
+# @author Tyler Close
set -e
# Where is E installed? This should be the root directory of the
-# installation. The definition of EJAR below assumes EHOME ends with
+# installation. The definition of EPATH below assumes EHOME ends with
# a "/". XXX We should fix this to be more tolerant.
#
# For example, "c:/Program Files/erights.org/"
@@ -39,9 +42,16 @@
JCMD="${{e.javacmd}}"
+# The initial classpath (which is actually a pathlist -- a list of
+# filepaths).
+#
+# If you change this definition to have more than one element, be sure
+# to use the separator for your platform. See the definition of "SEP"
+# below. This initial setting is added on to by -cpa and -cpb.
+#
+# Assumes EHOME ends in a "/". See note on EHOME above.
-# Assumes EHOME ends in a "/". See note above.
-EJAR=${EHOME}e.jar
+EPATH=${EHOME}e.jar
# This function normalizes a file path so that bash will recognize it
@@ -61,7 +71,7 @@
# This function normalizes a file path so E will recognize it. In the
# Cygwin environment, this needs to undo the funny path prefix
-# maniplutaion done by cygwin, such as turning "d:" into "//d/", or
+# manipulation done by cygwin, such as turning "d:" into "//d/", or
# "d:/cygwin/bin" into "/usr/bin". However, we still use only forward
# slashes, not backslashes, as path separators, in order for the
# normalized path to pass through bash without needing further escapes.
@@ -79,7 +89,6 @@
JCMD=`normalizeBashPath "$JCMD"`
-
function usage {
echo "usage: e [-options] [(e-script.e | \"-\") [args...]]"
exit -1
@@ -94,6 +103,23 @@
# These should come from props
jpush "-Xfuture"
+# SEP is the platform dependent pathlist separator. On MSWindows/cygwin,
+# it's ";". Everywhere else it's ":".
+#
+# Used to build the -cp value to passed to java.
+
+if [ "$OSTYPE" = "cygwin" ]
+then
+ SEP=";"
+else
+ if [ "$OSTYPE" = "cygwin32" ]
+ then
+ SEP=";"
+ else
+ SEP=":"
+ fi
+fi
+
# either zero or one long
declare -a ecmd
@@ -101,15 +127,21 @@
while [ $(($# >= 1)) = 1 ]; do
case $1 in
- -cp ) jpush "$1"; shift
+ -cpa ) shift
+ if [ $(($# < 1)) = 1 ]; then usage; fi
+ EPATH=${EPATH}${SEP}$1
+ shift;;
+ -cpb ) shift
if [ $(($# < 1)) = 1 ]; then usage; fi
- jpush "$1"; shift;;
+ EPATH=$1${SEP}${EPATH}
+ shift;;
-D* ) jpush "$1"; shift;;
-J* ) jpush "${1#-J}"; shift;;
--help )
echo "e [-options] script [args...]"
echo "where options are:"
- echo " -cp <classpath> Defines classpath. Passed to java."
+ echo " -cpa <afterpath> Adds to end of classpath."
+ echo " -cpb <beforepath> Adds to beginning of classpath."
echo " -D<name>=<value> Defines Property. Passed to java."
echo " -J<java-option> java-option passed to java."
echo " For example, \"e -J-version\" shows the Java version."
@@ -131,8 +163,9 @@
esac
done
-cmd=("${JCMD}" -jar "${jopts[@]}" "-De.home=${EHOME}" \
- "${EJAR}" "${ecmd[@]}" "$@")
+cmd=("${JCMD}" -cp "${EPATH}" "${jopts[@]}" "-De.home=${EHOME}" \
+ org.erights.e.elang.interp.Interp \
+ "${ecmd[@]}" "$@")
if [ $execflag = exec ]; then
exec "${cmd[@]}"
1.15 +9 -5 e/src/jsrc/net/captp/jcomm/SturdyRef.java
Index: SturdyRef.java
===================================================================
RCS file: /cvs/e/src/jsrc/net/captp/jcomm/SturdyRef.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- SturdyRef.java 2001/09/23 05:14:48 1.14
+++ SturdyRef.java 2001/11/19 19:15:35 1.15
@@ -23,6 +23,8 @@
import org.erights.e.elib.eio.TextWriter;
import org.erights.e.elib.serial.Persistent;
import org.erights.e.elib.tables.ConstList;
+import org.erights.e.elib.base.EComparable;
+import org.erights.e.elib.prim.E;
import java.io.IOException;
import java.math.BigInteger;
@@ -31,7 +33,7 @@
* An object reference that be checkpointed and/or externalized and which can
* survive network partitions.
*/
-public final class SturdyRef implements Persistent {
+public final class SturdyRef implements EComparable, Persistent {
/** The LocatorUnum that links us to the outside world. */
private LocatorUnum myLocatorUnum;
@@ -51,7 +53,8 @@
/**
* Package scope constructor for a new SturdyRef.
*
- * @param locatorUnum The LocatorUnum which maintains the new ref's registration
+ * @param locatorUnum The LocatorUnum which maintains the new ref's
+ * registration
* @param searchPath Hints about how to find the new ref's home vat
* @param swissNum Swiss number of the object that the new ref designates
*/
@@ -75,9 +78,10 @@
* @return 0.0 iff this and other designate the same object. Otherwise
* NaN.
*/
- public double compareTo(SturdyRef other) {
- if (myHostID.equals(other.myHostID) &&
- mySwissNum.equals(other.mySwissNum))
+ public double compareTo(EComparable other) {
+ SturdyRef sturdy = (SturdyRef)E.as(other, SturdyRef.class);
+ if (myHostID.equals(sturdy.myHostID) &&
+ mySwissNum.equals(sturdy.mySwissNum))
{
return 0.0;
} else {
1.75 +2 -0 e/src/jsrc/org/erights/e/elang/interp/ScopeSetup.java
Index: ScopeSetup.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/interp/ScopeSetup.java,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- ScopeSetup.java 2001/11/17 18:25:54 1.74
+++ ScopeSetup.java 2001/11/19 19:15:35 1.75
@@ -55,6 +55,7 @@
import org.erights.e.elib.tables.ESet;
import org.erights.e.elib.util.ClassCache;
import org.erights.e.meta.java.io.FileGetter;
+import org.quasiliteral.quasiterm.QuasiTermBuilder;
/**
* The initial namespace as seen by the E language programmer.
@@ -184,6 +185,7 @@
um.comp("epatt__quasiParser", univ,
"<import:org.erights.e.elang.syntax.epatt__quasiParser>");
um.comp("sml__quasiParser", XMLQuasiParser.XMLQuasiParserMaker);
+ um.comp("term__quasiParser", QuasiTermBuilder.THE_ONE);
um.init("universalScope", univ); // not uconstant
OuterScope realUniv = um.scope();
1.12 +5 -4 e/src/jsrc/org/erights/e/elib/quasi/MatchMaker.java
Index: MatchMaker.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/quasi/MatchMaker.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- MatchMaker.java 2001/11/10 19:40:46 1.11
+++ MatchMaker.java 2001/11/19 19:15:35 1.12
@@ -24,10 +24,11 @@
/**
- * Represents a pattern template. It plus the args are a pattern.
- * Will match itself plus args against a provided specimen and either
- * 1) report failure, or 2) report success and provide binding
- * resulting from the match.
+ * Represents a pattern template.
+ * <p>
+ * A MatchMaker plus the args are a pattern. It will match itself plus args
+ * against a provided specimen and either 1) report failure, or 2) report
+ * success and provide binding resulting from the match.
*
* @author <a href="mailto:markm@erights.org">Mark S. Miller</a>
*/
1.9 +12 -0 e/src/jsrc/org/erights/e/elib/quasi/ValueMaker.java
Index: ValueMaker.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/quasi/ValueMaker.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ValueMaker.java 2001/09/06 09:55:49 1.8
+++ ValueMaker.java 2001/11/19 19:15:35 1.9
@@ -32,6 +32,18 @@
/**
* Each each arg to fill in the corresponding hole, and return the
* resulting value.
+ * <p>
+ * It is often appropriate to think of <ul>
+ * <li>a ValueMaker as an expression,</li>
+ * <li>substitution as expression evaluation,</li>
+ * <li>the 'args' array as the environment,</li>
+ * <li>dollar-holes as variable names (actually numbers) to be looked up
+ * in the environment, and</li>
+ * <li>the result as the value the expression evaluated to.</li>
+ * </ul>
+ * In this sense, we can think of E's quasiliteral framework as an means
+ * for the non-privileged extension of the expression evaluation
+ * machinery.
*/
Object substitute(Object[] args);
}
1.18 +6 -3 e/src/jsrc/org/erights/e/elib/tables/ConstList.java
Index: ConstList.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tables/ConstList.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- ConstList.java 2001/11/10 19:40:48 1.17
+++ ConstList.java 2001/11/19 19:15:35 1.18
@@ -21,7 +21,9 @@
import org.erights.e.elib.eio.TextWriter;
import org.erights.e.elib.prim.StaticMaker;
+import org.erights.e.elib.prim.E;
import org.erights.e.elib.serial.PassByConstruction;
+import org.erights.e.elib.base.EComparable;
import java.io.IOException;
import java.lang.reflect.Array;
@@ -34,7 +36,7 @@
* @author <a href="mailto:markm@erights.org">Mark S. Miller</a>
*/
public abstract class ConstList
- extends EList implements PassByConstruction, Selfless {
+ extends EList implements EComparable, PassByConstruction, Selfless {
static private final long serialVersionUID = -4704670888158933364L;
@@ -81,8 +83,9 @@
* comparison, in left-to-right order. If all compare equal but one list
* is shorter, the shorter list is less than the longer list.
*/
- public double compareTo(ConstList other) {
- return compareTo(other, SimpleCompFunc.THE_ONE);
+ public double compareTo(EComparable other) {
+ return compareTo((ConstList)E.as(other, ConstList.class),
+ SimpleCompFunc.THE_ONE);
}
/**
1.29 +9 -6 e/src/jsrc/org/erights/e/elib/tables/ConstMap.java
Index: ConstMap.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tables/ConstMap.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- ConstMap.java 2001/11/12 18:23:17 1.28
+++ ConstMap.java 2001/11/19 19:15:35 1.29
@@ -21,8 +21,10 @@
import org.erights.e.elib.eio.TextWriter;
import org.erights.e.elib.prim.StaticMaker;
+import org.erights.e.elib.prim.E;
import org.erights.e.elib.serial.PassByConstruction;
import org.erights.e.elib.util.ArityMismatchException;
+import org.erights.e.elib.base.EComparable;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -44,7 +46,7 @@
* @author <a href="mailto:markm@erights.org">Mark S. Miller</a>
*/
public abstract class ConstMap
- extends EMap implements Selfless, PassByConstruction {
+ extends EMap implements EComparable, Selfless, PassByConstruction {
static private final long serialVersionUID = -6424210992869387563L;
@@ -125,17 +127,18 @@
* alternate implementations of ConstMaps must also treat this as
* the base case. XXX security implications?
*/
- public double compareTo(ConstMap other) {
+ public double compareTo(EComparable other) {
+ ConstMap omap = (ConstMap)E.as(other, ConstMap.class);
int sz = size();
- int otherSz = other.size();
+ int otherSz = omap.size();
if (sz < otherSz) {
- return -other.compareTo(this);
+ return -omap.compareTo(this);
}
//at this point, this ConstMap is at least as big as other, so this
//ConstMap's domain is either a superset (strict or not) or
//incomparable.
- ConstMap union = or(other);
- ConstMap isect = and(other);
+ ConstMap union = or(omap);
+ ConstMap isect = and(omap);
int unionSz = union.size();
int isectSz = isect.size();
if (unionSz == isectSz) {
1.2 +6 -3 e/src/jsrc/org/erights/e/elib/tables/ConstSet.java
Index: ConstSet.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tables/ConstSet.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ConstSet.java 2001/11/11 05:54:37 1.1
+++ ConstSet.java 2001/11/19 19:15:35 1.2
@@ -3,6 +3,8 @@
import org.erights.e.elib.serial.PassByConstruction;
import org.erights.e.elib.eio.TextWriter;
import org.erights.e.elib.prim.StaticMaker;
+import org.erights.e.elib.prim.E;
+import org.erights.e.elib.base.EComparable;
import java.io.IOException;
@@ -11,7 +13,7 @@
* @author <a href="mailto:markm@caplet.com">Mark S Miller</a>
*/
public class ConstSet
- extends ESet implements PassByConstruction, Selfless {
+ extends ESet implements EComparable, PassByConstruction, Selfless {
/**
*
@@ -78,7 +80,8 @@
* If this set is a strict superset of other, return 1.0.
* Otherwise return NaN.
*/
- public double compareTo(ConstSet other) {
- return getMap().compareTo(other.getMap());
+ public double compareTo(EComparable other) {
+ ConstSet oset = (ConstSet)E.as(other, ConstSet.class);
+ return getMap().compareTo(oset.getMap());
}
}
1.23 +2 -1 e/src/jsrc/org/erights/e/elib/tables/Twine.java
Index: Twine.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tables/Twine.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- Twine.java 2001/11/10 19:40:48 1.22
+++ Twine.java 2001/11/19 19:15:35 1.23
@@ -20,6 +20,7 @@
*/
import org.erights.e.elib.base.SourceSpan;
+import org.erights.e.elib.base.EComparable;
import org.erights.e.elib.prim.E;
import org.erights.e.elib.prim.StaticMaker;
@@ -436,7 +437,7 @@
* Optimized for the case where both are Twine. Otherwise should be
* identical.
*/
- public double compareTo(ConstList other) {
+ public double compareTo(EComparable other) {
if (other instanceof Twine) {
return (double)bare().compareTo(((Twine)other).bare());
} else {
1.7 +59 -11 e/src/jsrc/org/quasiliteral/term/Functor.java
Index: Functor.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/Functor.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Functor.java 2001/11/10 19:40:53 1.6
+++ Functor.java 2001/11/19 19:15:35 1.7
@@ -3,6 +3,7 @@
import antlr.Token;
import org.erights.e.develop.format.StringHelper;
import org.erights.e.elib.base.SourceSpan;
+import org.erights.e.elib.base.EComparable;
import org.erights.e.elib.prim.E;
import org.erights.e.elib.prim.StaticMaker;
import org.erights.e.elib.serial.PassByConstruction;
@@ -38,7 +39,8 @@
* @author Many ideas from Danfuzz Bornstein
* @author Many thanks also to Dean Tribble
*/
-public class Functor implements Selfless, PassByConstruction, Persistent {
+public class Functor
+ implements EComparable, Selfless, PassByConstruction, Persistent {
/**
*
@@ -61,11 +63,11 @@
* <pre>
* If myValue is myValueType is
* null -1
- * a Character LiteralChar
- * a BigInteger LiteralInteger
- * a Double LiteralFloat64
- * a String LiteralString
- * a Twine LiteralString
+ * a Character TermParser.LiteralChar
+ * a BigInteger TermParser.LiteralInteger
+ * a Double TermParser.LiteralFloat64
+ * a String TermParser.LiteralString
+ * a Twine TermParser.LiteralString
* </pre>
*/
private int myValueType;
@@ -154,6 +156,28 @@
}
/**
+ *
+ */
+ public Object build(TermBuilder builder) {
+ if (null == myValue) {
+ return builder.functor(new AstroToken(TermParser.ID,
+ mySource,
+ myName));
+ } else if (isJustLiteral()) {
+ return builder.literal(new AstroToken(myValueType,
+ mySource,
+ myValue));
+ } else {
+ return builder.functor(new AstroToken(TermParser.ID,
+ Twine.fromString(""),
+ myName),
+ new AstroToken(myValueType,
+ mySource,
+ myValue));
+ }
+ }
+
+ /**
* 'FunctorMaker new(myTokenType, mySource, myOptValue)'
*/
public Object[] getCanonicalState() {
@@ -185,18 +209,35 @@
}
/**
+ * Indicates the type of getValue().
+ * <pre>
+ * If getValue() is getValueType() is
+ * null -1
+ * a Character TermParser.LiteralChar
+ * a BigInteger TermParser.LiteralInteger
+ * a Double TermParser.LiteralFloat64
+ * a String TermParser.LiteralString
+ * a Twine TermParser.LiteralString
+ * </pre>
+ */
+ public int getValueType() {
+ return myValueType;
+ }
+
+ /**
*
*/
- public double compareTo(Functor other) {
- double result = myName.compareTo(other.myName);
+ public double compareTo(EComparable other) {
+ Functor ofunctor = (Functor)E.as(other, Functor.class);
+ double result = myName.compareTo(ofunctor.myName);
if (0.0 != result) {
return result;
}
- result = myValueType - other.myValueType;
+ result = myValueType - ofunctor.myValueType;
if (0.0 != result) {
return result;
}
- return E.asFloat64(E.call(myValue, "compareTo", other.myValue));
+ return E.asFloat64(E.call(myValue, "compareTo", ofunctor.myValue));
}
/**
@@ -209,6 +250,13 @@
/**
*
*/
+ private boolean isJustLiteral() {
+ return TermParser.getTokenNames().get(myValueType).equals(myName);
+ }
+
+ /**
+ *
+ */
public String toString(boolean quasiFlag) {
if (null == myValue) {
return myName;
@@ -219,7 +267,7 @@
valueStr = StringHelper.replaceAll(valueStr, "@", "@@");
valueStr = StringHelper.replaceAll(valueStr, "`", "``");
}
- if (TermParser.getTokenNames().get(myValueType).equals(myName)) {
+ if (isJustLiteral()) {
return valueStr;
}
return myName + ":" + valueStr;
1.5 +41 -29 e/src/jsrc/org/quasiliteral/term/SimpleTermBuilder.java
Index: SimpleTermBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/SimpleTermBuilder.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SimpleTermBuilder.java 2001/11/06 06:27:33 1.4
+++ SimpleTermBuilder.java 2001/11/19 19:15:35 1.5
@@ -8,10 +8,11 @@
* For building a actual (not quasiliteral) Term/Functor tree directly.
* <p>
* The parameterization of types from TermBuilder are:<ul>
- * <li>PDollarHole, PAtHole, PHole, PDollarRepr -- not applicable.</li>
+ * <li>PDollarHole, PAtHole, PHole -- not applicable.</li>
+ * <li>PLit -- AstroToken(Literal*).<.li>
* <li>PFunctor -- {@link Functor}</li>
- * <li>PTerm -- {@link Term}</li>
- * <li>PTerms, PArgs -- a {@link ConstList} of {@link Term}</li>
+ * <li>PTerm, PArg -- {@link Term}</li>
+ * <li>PArgs -- a {@link ConstList} of {@link Term}</li>
* </ul>
*
* @author <a href="mailto:markm@caplet.com">Mark S Miller</a>
@@ -36,7 +37,7 @@
/**
* @return :ConstList(Term)
*/
- public Object terms() {
+ public Object argList() {
return ConstList.EmptyList;
}
@@ -44,7 +45,7 @@
* @param first :Term
* @return :ConstList(Term)
*/
- public Object terms(Object first) {
+ public Object argList(Object first) {
return ConstList.EmptyList.with(first);
}
@@ -53,12 +54,20 @@
* @param next :Term
* @return :ConstList(Term)
*/
- public Object terms(Object list, Object next) {
+ public Object argList(Object list, Object next) {
return ((ConstList)list).with(next);
}
/**
* @param fnctr :Functor
+ * @return :Term
+ */
+ public Object term(Object fnctr) {
+ return new Term((Functor)fnctr, ConstList.EmptyList);
+ }
+
+ /**
+ * @param fnctr :Functor
* @param args :ConstList(Term)
* @return :Term
*/
@@ -66,14 +75,24 @@
return new Term((Functor)fnctr, (ConstList)args);
}
+ /**
+ * @param lit :AstroToken(Literal*)
+ * @return :Functor
+ */
+ public Object literal(Object lit) {
+ AstroToken tok = (AstroToken)lit;
+ //XXX check that it's a kind of literal
+ return tok.asFunctor(TermParser.getTokenNames());
+ }
+
/**
- * @param ident :AstroToken(Identifier)
+ * @param ident :AstroToken(ID)
* @return :Functor
*/
- public Object tag(Object ident) {
+ public Object functor(Object ident) {
AstroToken tok = (AstroToken)ident;
- if (TermParser.Identifier != tok.getType()) {
- throw new RuntimeException("Must be Identifier: " + ident);
+ if (TermParser.ID != tok.getType()) {
+ throw new RuntimeException("Must be ID: " + ident);
}
String name = (String)tok.getValue();
if (null == name) {
@@ -83,35 +102,23 @@
}
/**
+ * @param ident :AstroToken(ID)
* @param lit :AstroToken(Literal*)
* @return :Functor
*/
- public Object literal(Object lit) {
- AstroToken tok = (AstroToken)lit;
- //XXX check that it's a kind of literal
- return tok.asFunctor(TermParser.getTokenNames());
- }
-
- /**
- * @param ident :AstroToken(Identifier)
- * @param colon :AstroToken(':')
- * @param lit :AstroToken(Literal*)
- * @return :Functor
- */
- public Object compound(Object ident, Object colon, Object lit) {
+ public Object functor(Object ident, Object lit) {
AstroToken idTok = (AstroToken)ident;
- AstroToken colonTok = (AstroToken)colon;
AstroToken litTok = (AstroToken)lit;
- if (TermParser.Identifier != idTok.getType()) {
- throw new RuntimeException("Must be Identifier: " + ident);
+ if (TermParser.ID != idTok.getType()) {
+ throw new RuntimeException("Must be ID: " + ident);
}
String name = (String)idTok.getValue();
if (null == name) {
throw new RuntimeException("Must have value: " + ident);
}
Twine source = (Twine)idTok.getSource()
- .add(colonTok.getSource())
+ .add(":")
.add(litTok.getSource());
return new Functor(name, source, litTok.getValue());
}
@@ -133,14 +140,19 @@
/**
* Not applicable
*/
- public Object dollarRepr(Object dHole, Object repr) {
+ public Object dollarQuant(Object dHole, Object quant) {
throw new RuntimeException("No holes, not quasi parsing");
}
/**
* Not applicable
*/
- public Object atRepr(Object terms, Object atHole, Object repr) {
+ public Object atQuant(Object optIdent, Object optQuant, Object atHole) {
throw new RuntimeException("No holes, not quasi parsing");
}
+
+ /**
+ *
+ */
+ public String toString() { return "<SimpleTermBuilder>"; }
}
1.3 +25 -13 e/src/jsrc/org/quasiliteral/term/Term.java
Index: Term.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/Term.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Term.java 2001/11/06 06:27:33 1.2
+++ Term.java 2001/11/19 19:15:35 1.3
@@ -9,6 +9,8 @@
import org.erights.e.elib.serial.Persistent;
import org.erights.e.elib.eio.TextWriter;
import org.erights.e.elib.prim.StaticMaker;
+import org.erights.e.elib.prim.E;
+import org.erights.e.elib.base.EComparable;
import org.erights.e.develop.format.StringHelper;
import org.quasiliteral.astro.Astro;
import antlr.collections.AST;
@@ -38,7 +40,8 @@
* @author Many ideas from Danfuzz Bornstein
* @author Many thanks also to Dean Tribble
*/
-public class Term implements Selfless, PassByConstruction, Persistent {
+public class Term
+ implements EComparable, Selfless, PassByConstruction, Persistent {
/**
*
@@ -108,6 +111,23 @@
}
/**
+ * Like a visitor pattern, where 'builder' is the visitor.
+ * <p>
+ * When built using the SimpleTermBuilder, the result should be
+ * a semantically equivalent copy.
+ */
+ public Object build(TermBuilder builder) {
+ Object builtFunctor = myFunctor.build(builder);
+ Object builtArgs = builder.argList();
+ int len = myArgs.size();
+ for (int i = 0; i < len; i++) {
+ Term arg = (Term)myArgs.get(i);
+ builtArgs = builder.argList(builtArgs, arg.build(builder));
+ }
+ return builder.term(builtFunctor, builtArgs);
+ }
+
+ /**
*
*/
public Object[] getCanonicalState() {
@@ -132,21 +152,13 @@
/**
*
*/
- public double compareTo(Term other) {
- double result = myFunctor.compareTo(other.myFunctor);
+ public double compareTo(EComparable other) {
+ Term oterm = (Term)E.as(other, Term.class);
+ double result = myFunctor.compareTo(oterm.myFunctor);
if (0.0 != result) {
return result;
- }
- int len = Math.min(myArgs.size(), other.myArgs.size());
- for (int i = 0; i < len; i++) {
- Functor f1 = ((Functor)myArgs.get(i));
- Functor f2 = ((Functor)other.myArgs.get(i));
- result = f1.compareTo(f2);
- if (0.0 != result) {
- return result;
- }
}
- return myArgs.size() - other.myArgs.size();
+ return myArgs.compareTo(oterm.myArgs);
}
/**
1.7 +41 -3 e/src/jsrc/org/quasiliteral/term/Term.updoc
Index: Term.updoc
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/Term.updoc,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Term.updoc 2001/11/11 05:54:37 1.6
+++ Term.updoc 2001/11/19 19:15:35 1.7
@@ -1,6 +1,32 @@
+ ? def t1 := term`"foo"()`
+ # value: term`"foo"`
+
+ ? def t2 := term`$t1(4)`
+ # value: term`"foo"(4)`
+
+ ? def t3 := term`$t1(bar, $t2)`
+ # value: term`"foo"(bar,
+ # "foo"(4))`
+
+ ?
+ ?
+ ?
+ ?
+ ?
+ ?
? def term__uriGetter := <unsafe:org.quasiliteral.term.*>
- # value: <unsafe:org.quasiliteral.term.*>
+ ? def qterm__uriGetter := <unsafe:org.quasiliteral.quasiterm.*>
+ # value: <unsafe:org.quasiliteral.quasiterm.*>
+
+ ? def term__quasiParser := <qterm:QuasiTermBuilder> THE_ONE()
+ # value: <SimpleTermBuilder>
+
+ ? term`foo(3, x(3, 'x'), zip)`
+ # value: term`foo(3,
+ # x(3, 'x'),
+ # zip)`
+ ?
? def TermParserMaker := <term:TermParser>
# value: <unsafe:org.quasiliteral.term.TermParser>
@@ -15,9 +41,21 @@
? term getArgs()
# value: [term`3`, term`x(3, 'x')`, term`zip`]
+ ? def SimpleTermBuilder := <term:SimpleTermBuilder> THE_ONE()
+ # value: <SimpleTermBuilder>
+
+ ? def term2 := term build(SimpleTermBuilder)
+ # value: term`foo(3,
+ # x(3, 'x'),
+ # zip)`
+
+ ? def f := TermParserMaker("foo:3")
+ # value: term`foo:3`
+
+ ? f build(SimpleTermBuilder)
+ # value: term`foo:3`
+
?
-
-
? def astro__uriGetter := <unsafe:org.quasiliteral.astro.*>
1.4 +62 -40 e/src/jsrc/org/quasiliteral/term/TermBuilder.java
Index: TermBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/TermBuilder.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TermBuilder.java 2001/11/05 03:15:51 1.3
+++ TermBuilder.java 2001/11/19 19:15:35 1.4
@@ -7,8 +7,8 @@
* <p>
* XXX TermBuilder, TermParser, term.y, and TermLexer are all to be replaced
* with Antlr-based equivalents. We hope that the abstraction provided by
- * TermBuilder may allow it (and its subclasses) to survive this transition
- * without great change.
+ * TermBuilder may allow it, its subclasses, and its clients to survive this
+ * transition without great change.
* <p>
* The arguments and return types are all 'Object' below, because the actual
* types are to be determined by the subclasses. However, these choices
@@ -22,13 +22,13 @@
* <li>PDollarHole -- as returned by dollarHole/1.</li>
* <li>PAtHole -- as returned by atHole/1.</li>
* <li>PHole -- a PDollarHole or a PAtHole.</li>
- * <li>PFunctor -- a PHole or as returned by tag/1, compound/3, or
+ * <li>PLit -- an AstroToken(Literal*), PDollarHole, or PAtHole
+ * <li>PFunctor -- a PHole or as returned by functor/1, functor/3, or
* literal/1.</li>
- * <li>PTerm -- as returned by term/2.</li>
- * <li>PDollarRepr -- as returned by dollarRepr/2.</li>
- * <li>PTerms -- a list of PTerm and PDollarRepss, as returned by
- * terms/0, terms/1, dollarRepr/2, and terms/2.</li>
- * <li>PArgs -- PTerms or as returned by atRepr/3.</li>
+ * <li>PTerm -- as returned by term/1 and term/2.</li>
+ * <li>PArg -- a PTerm or as returned by dollarQuant/2 or atQuant/3.</li>
+ * <li>PArgs -- a list of PArgs, as returned by argList/0, argList/1,
+ * or argList/2.</li>
* </ul>
*
* @author <a href="mailto:markm@caplet.com">Mark S Miller</a>
@@ -47,45 +47,50 @@
boolean doesQuasis();
/**
- * The empty terms list
+ * The empty args list
*
- * @return :PTerms
+ * @return :PArgs
*/
- Object terms();
+ Object argList();
/**
- * The terms list of one element.
+ * The args list of one element.
*
- * @param first :PTerm
- * @return :PTerms
+ * @param first :PArg
+ * @return :PArgs
*/
- Object terms(Object first);
+ Object argList(Object first);
/**
- * Extend terms list with an additional term, like a backwards cons.
+ * Extend args list with an additional term, like a backwards cons.
*
- * @param list :PTerms
- * @param next :(PTerm | PDollarRepr)
- * @return :PTerms
+ * @param list :PArgs
+ * @param next :PArg
+ * @return :PArgs
*/
- Object terms(Object list, Object next);
+ Object argList(Object list, Object next);
/**
- * The term 'fnctr(terms...)'
+ * A term without an explicit args list.
+ * <p>
+ * When fnctr is not a hole, term/1 just equivalent to term/2 with an
+ * empty args list. When fnctr is a hole, then it is promoted from being
+ * a hole for a Functor to being a hole for a Term. As a hole for a Term,
+ * it will still coerce a Functor to a Term with an empty args list.
*
* @param fnctr :PFunctor
- * @param args :PArgs
* @return :PTerm
*/
- Object term(Object fnctr, Object args);
+ Object term(Object fnctr);
/**
- * The functor whose type name is ident's value.
+ * The term 'fnctr(args...)'
*
- * @param ident :AstroToken(Identifier)
- * @return :PFunctor
+ * @param fnctr :PFunctor
+ * @param args :PArgs
+ * @return :PTerm
*/
- Object tag(Object ident);
+ Object term(Object fnctr, Object args);
/**
* The functor representing this literal
@@ -96,15 +101,22 @@
Object literal(Object lit);
/**
+ * The functor whose type name is ident's value.
+ *
+ * @param ident :AstroToken(ID)
+ * @return :PFunctor
+ */
+ Object functor(Object ident);
+
+ /**
* The functor whose type name is ident's value, and whose value is
* lit's value.
*
- * @param ident :AstroToken(Identifier)
- * @param colon :AstroToken(':')
- * @param lit :AstroToken(Literal*)
+ * @param ident :AstroToken(ID)
+ * @param lit :PLit
* @return :PFunctor
*/
- Object compound(Object ident, Object colon, Object lit);
+ Object functor(Object ident, Object lit);
/**
* A dollar-hole corresponds to an extracted expression whose value
@@ -125,7 +137,7 @@
Object atHole(Object index);
/**
- * A dollar-repr represents some number of terms to be spliced into the
+ * A dollar-quant represents some number of terms to be spliced into the
* args list (by substitution) at runtime.
* <p>
* This should coerce the substitution argument to a list of terms,
@@ -133,23 +145,33 @@
* this list into the args list of the resulting term.
*
* @param dHole :PDollarHole
- * @param repr :AstroToken('?', '+', or '*')
- * @return :PDollarReps
+ * @param quant :AstroToken('?', '+', or '*')
+ * @return :PArg
*/
- Object dollarRepr(Object dHole, Object repr);
+ Object dollarQuant(Object dHole, Object quant);
/**
- * The last element of an args list may be an at-hole annotated with a
+ * An element of an args list may be an at-hole annotated with a
* repetitions indicator, '?', '+', or '*' (with the usual meanings).
* <p>
* This should extract a list of terms from the specimen, require the
* size of the list to match the indicator, and provide this list for
* matching against the extracted pattern.
+ * <p>
+ * Actually, an optional functor-type identifier may be provided as well,
+ * and if it is, the quant argument may be left out. If the identifier is
+ * provided, then only terms whose functor matches will be matched by
+ * this pattern. If the quant is left out, then exactly one will be
+ * matched.
+ * <p>
+ * Note that, in the 'term' source language you may leave out both the
+ * identifier and quant, but that results in the term/1 production being
+ * called instead.
*
- * @param terms :PTerms
+ * @param optIdent :nullOk(AstroToken(ID))
+ * @param optQuant :nullOk(AstroToken('?', '+', or '*'))
* @param atHole :PAtHole
- * @param repr :AstroToken('?', '+', or '*')
- * @return :PArgs
+ * @return :PArg
*/
- Object atRepr(Object terms, Object atHole, Object repr);
+ Object atQuant(Object optIdent, Object optQuant, Object atHole);
}
1.5 +1 -1 e/src/jsrc/org/quasiliteral/term/TermLexer.java
Index: TermLexer.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/TermLexer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- TermLexer.java 2001/11/06 06:27:33 1.4
+++ TermLexer.java 2001/11/19 19:15:35 1.5
@@ -479,7 +479,7 @@
nextChar();
} while (myChar != EOFCHAR && isIdentifierPart((char)myChar));
Twine source = endToken();
- return new AstroToken(TermParser.Identifier, source, source.bare());
+ return new AstroToken(TermParser.ID, source, source.bare());
}
/** pretty self explanatory */
1.5 +85 -81 e/src/jsrc/org/quasiliteral/term/TermParser.java
Index: TermParser.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/TermParser.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- TermParser.java 2001/11/06 06:27:33 1.4
+++ TermParser.java 2001/11/19 19:15:35 1.5
@@ -148,58 +148,57 @@
return valstk[ptr];
}
//#### end semantic value section ####
-public final static short Identifier=257;
+public final static short ID=257;
public final static short LiteralChar=258;
public final static short LiteralInteger=259;
public final static short LiteralFloat64=260;
public final static short LiteralString=261;
public final static short YYERRCODE=256;
final static short yylhs[] = { -1,
- 0, 1, 1, 3, 3, 4, 4, 4, 5, 5,
- 5, 5, 8, 2, 2, 2, 2, 11, 11, 9,
- 6, 7, 7, 7, 10, 10, 10, 10,
+ 0, 1, 1, 3, 3, 4, 4, 5, 5, 5,
+ 5, 5, 2, 2, 2, 2, 2, 10, 10, 6,
+ 8, 7, 7, 7, 9, 9, 9, 9,
};
final static short yylen[] = { 2,
- 1, 1, 4, 0, 1, 1, 2, 4, 1, 3,
- 1, 3, 2, 1, 1, 3, 1, 1, 1, 4,
+ 1, 1, 4, 0, 1, 1, 3, 1, 2, 3,
+ 2, 2, 1, 1, 3, 1, 3, 1, 1, 4,
4, 1, 1, 1, 1, 1, 1, 1,
};
final static short yydefred[] = { 0,
0, 25, 26, 27, 28, 0, 0, 0, 1, 0,
- 19, 18, 15, 17, 0, 0, 0, 0, 16, 0,
- 0, 9, 0, 5, 0, 0, 11, 0, 20, 21,
- 3, 0, 22, 23, 24, 7, 13, 10, 0, 12,
- 8,
+ 18, 19, 13, 16, 0, 0, 0, 0, 15, 17,
+ 0, 0, 0, 22, 23, 24, 8, 0, 0, 6,
+ 0, 0, 20, 21, 0, 12, 3, 0, 9, 11,
+ 10, 7,
};
final static short yydgoto[] = { 8,
- 9, 10, 23, 24, 25, 11, 36, 27, 28, 13,
- 14,
+ 27, 10, 28, 29, 30, 11, 32, 12, 13, 14,
};
-final static short yysindex[] = { -36,
- -45, 0, 0, 0, 0, -108, -107, 0, 0, -23,
- 0, 0, 0, 0, -229, -238, -237, -36, 0, -102,
- -100, 0, -15, 0, -17, -39, 0, -39, 0, 0,
- 0, -36, 0, 0, 0, 0, 0, 0, -39, 0,
- 0,
+final static short yysindex[] = { -31,
+ -40, 0, 0, 0, 0, -102, -100, 0, 0, -11,
+ 0, 0, 0, 0, -27, -235, -234, -36, 0, 0,
+ -95, -87, -32, 0, 0, 0, 0, -1, -3, 0,
+ -29, -20, 0, 0, -20, 0, 0, -36, 0, 0,
+ 0, 0,
};
final static short yyrindex[] = { 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 0, 0, 0, 0, -8, 0, 0,
- 0, 0, 0, 0, -7, -32, 0, -30, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, -32, 0,
- 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,
+ 0, 0, -25, 0, 0, 0, 0, 0, 6, 0,
+ -5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,
};
final static short yygindex[] = { 0,
- -13, 0, 0, 0, 0, -12, -21, 3, 36, 22,
- 0,
+ 48, 0, 0, 0, 11, -16, -19, -15, 35, 36,
};
-final static int YYTABLESIZE=225;
+final static int YYTABLESIZE=234;
final static short yytable[] = { 6,
- 14, 2, 35, 34, 22, 26, 37, 19, 19, 18,
- 18, 19, 15, 18, 16, 17, 18, 41, 38, 39,
- 20, 21, 29, 33, 30, 31, 32, 7, 2, 3,
- 4, 5, 4, 6, 40, 12, 19, 0, 0, 0,
- 14, 14, 2, 0, 14, 2, 0, 0, 0, 0,
+ 2, 31, 14, 35, 6, 26, 25, 36, 6, 26,
+ 25, 39, 26, 25, 14, 14, 40, 15, 14, 41,
+ 16, 31, 17, 21, 22, 15, 24, 7, 18, 33,
+ 24, 7, 7, 24, 18, 18, 7, 34, 18, 37,
+ 38, 2, 14, 7, 2, 4, 5, 9, 42, 19,
+ 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -216,16 +215,16 @@
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 3, 4, 5,
+ 23, 2, 3, 4, 5, 1, 2, 3, 4, 5,
+ 2, 3, 4, 5,
};
final static short yycheck[] = { 36,
- 0, 0, 42, 43, 18, 18, 28, 40, 41, 40,
- 41, 44, 58, 44, 123, 123, 40, 39, 32, 32,
- 259, 259, 125, 63, 125, 41, 44, 64, 258, 259,
- 260, 261, 41, 41, 32, 0, 15, -1, -1, -1,
- 40, 41, 41, -1, 44, 44, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 18, 0, 23, 36, 42, 43, 23, 36, 42,
+ 43, 31, 42, 43, 40, 41, 32, 58, 44, 35,
+ 123, 38, 123, 259, 259, 58, 63, 64, 40, 125,
+ 63, 64, 64, 63, 40, 41, 64, 125, 44, 41,
+ 44, 41, 40, 64, 44, 41, 41, 0, 38, 15,
+ 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -242,7 +241,8 @@
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 257, 258, 259, 260, 261,
+ 257, 258, 259, 260, 261, 257, 258, 259, 260, 261,
+ 258, 259, 260, 261,
};
final static short YYFINAL=8;
final static short YYMAXTOKEN=261;
@@ -263,8 +263,8 @@
null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,
null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,
null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,
-null,null,null,null,null,null,null,null,"Identifier","LiteralChar",
-"LiteralInteger","LiteralFloat64","LiteralString",
+null,null,null,null,null,null,null,null,"ID","LiteralChar","LiteralInteger",
+"LiteralFloat64","LiteralString",
};
final static String yyrule[] = {
"$accept : start",
@@ -273,32 +273,32 @@
"term : functor '(' argList ')'",
"argList :",
"argList : args",
-"args : terms",
-"args : atHole repr",
-"args : terms ',' atHole repr",
-"terms : term",
-"terms : terms ',' term",
-"terms : dollarRepr",
-"terms : terms ',' dollarRepr",
-"dollarRepr : dollarHole repr",
-"functor : Identifier",
+"args : arg",
+"args : args ',' arg",
+"arg : term",
+"arg : dollarHole quant",
+"arg : ID quant atHole",
+"arg : quant atHole",
+"arg : ID atHole",
"functor : literal",
-"functor : Identifier ':' literal",
+"functor : ID",
+"functor : ID ':' literal",
"functor : hole",
+"functor : ID ':' hole",
"hole : dollarHole",
"hole : atHole",
"dollarHole : '$' '{' LiteralInteger '}'",
"atHole : '@' '{' LiteralInteger '}'",
-"repr : '?'",
-"repr : '+'",
-"repr : '*'",
+"quant : '?'",
+"quant : '+'",
+"quant : '*'",
"literal : LiteralChar",
"literal : LiteralInteger",
"literal : LiteralFloat64",
"literal : LiteralString",
};
-//#line 92 "term.y"
+//#line 91 "term.y"
/**
* contains all the tokens after yylval
@@ -410,7 +410,7 @@
/**
*
*/
-static /*package*/ ConstList getTokenNames() {
+static public ConstList getTokenNames() {
return ConstList.fromArray(TheTokens);
}
//#line 365 "TermParser.java"
@@ -565,7 +565,7 @@
break;
case 2:
//#line 31 "term.y"
-{ yyval = b.term(val_peek(0), b.terms()); }
+{ yyval = b.term(val_peek(0)); }
break;
case 3:
//#line 32 "term.y"
@@ -573,53 +573,57 @@
break;
case 4:
//#line 36 "term.y"
-{ yyval = b.terms(); }
+{ yyval = b.argList(); }
+break;
+case 6:
+//#line 41 "term.y"
+{ yyval = b.argList(val_peek(0)); }
break;
case 7:
//#line 42 "term.y"
-{ yyval = b.atRepr(b.terms(), val_peek(1), val_peek(0)); }
+{ yyval = b.argList(val_peek(2), val_peek(0)); }
break;
-case 8:
-//#line 43 "term.y"
-{ yyval = b.atRepr(val_peek(3), val_peek(1), val_peek(0)); }
-break;
case 9:
-//#line 47 "term.y"
-{ yyval = b.terms(val_peek(0)); }
+//#line 50 "term.y"
+{ yyval = b.dollarQuant(val_peek(1), val_peek(0)); }
break;
case 10:
-//#line 48 "term.y"
-{ yyval = b.terms(val_peek(2), val_peek(0)); }
+//#line 51 "term.y"
+{ yyval = b.atQuant(val_peek(2), val_peek(1), val_peek(0)); }
+break;
+case 11:
+//#line 52 "term.y"
+{ yyval = b.atQuant(null, val_peek(1), val_peek(0)); }
break;
case 12:
-//#line 51 "term.y"
-{ yyval = b.terms(val_peek(2), val_peek(0)); }
+//#line 53 "term.y"
+{ yyval = b.atQuant(val_peek(1), null, val_peek(0)); }
break;
case 13:
-//#line 55 "term.y"
-{ yyval = b.dollarRepr(val_peek(1), val_peek(0)); }
+//#line 57 "term.y"
+{ yyval = b.literal(val_peek(0)); }
break;
case 14:
-//#line 59 "term.y"
-{ yyval = b.tag(val_peek(0)); }
+//#line 58 "term.y"
+{ yyval = b.functor(val_peek(0)); }
break;
case 15:
-//#line 60 "term.y"
-{ yyval = b.literal(val_peek(0)); }
+//#line 59 "term.y"
+{ yyval = b.functor(val_peek(2), val_peek(0)); }
break;
-case 16:
+case 17:
//#line 61 "term.y"
-{ yyval = b.compound(val_peek(2), val_peek(1), val_peek(0)); }
+{ yyval = b.functor(val_peek(2), val_peek(0)); }
break;
case 20:
-//#line 71 "term.y"
+//#line 70 "term.y"
{ yyval = b.dollarHole(val_peek(1)); }
break;
case 21:
-//#line 75 "term.y"
+//#line 74 "term.y"
{ yyval = b.atHole(val_peek(1)); }
break;
-//#line 568 "TermParser.java"
+//#line 572 "TermParser.java"
//########## END OF USER-SUPPLIED ACTIONS ##########
}//switch
//#### Now let's reduce... ####
1.5 +20 -21 e/src/jsrc/org/quasiliteral/term/term.y
Index: term.y
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/term.y,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- term.y 2001/11/06 06:27:33 1.4
+++ term.y 2001/11/19 19:15:35 1.5
@@ -14,7 +14,7 @@
import java.io.IOException;
%}
-%token Identifier //Like E: [0-9a-zA-Z_][a-zA-Z_]*
+%token ID //Like E: [0-9a-zA-Z_][a-zA-Z_]*
%token LiteralChar //like Java & E: unicode
%token LiteralInteger //like Java & E: precision unlimited
@@ -28,38 +28,37 @@
;
term:
- functor { $$ = b.term($1, b.terms()); }
+ functor { $$ = b.term($1); }
| functor '(' argList ')' { $$ = b.term($1, $3); }
;
argList:
- /* empty */ { $$ = b.terms(); }
+ /* empty */ { $$ = b.argList(); }
| args
;
args:
- terms
- | atHole repr { $$ = b.atRepr(b.terms(), $1, $2); }
- | terms ',' atHole repr { $$ = b.atRepr($1, $3, $4); }
+ arg { $$ = b.argList($1); }
+ | args ',' arg { $$ = b.argList($1, $3); }
;
-terms:
- term { $$ = b.terms($1); }
- | terms ',' term { $$ = b.terms($1, $3); }
-
- | dollarRepr
- | terms ',' dollarRepr { $$ = b.terms($1, $3); }
- ;
-
-dollarRepr:
- dollarHole repr { $$ = b.dollarRepr($1, $2); }
+/**
+ * Each arg represents some number of terms
+ */
+arg:
+ term
+ | dollarHole quant { $$ = b.dollarQuant($1, $2); }
+ | ID quant atHole { $$ = b.atQuant($1, $2, $3); }
+ | quant atHole { $$ = b.atQuant(null, $1, $2); }
+ | ID atHole { $$ = b.atQuant($1, null, $2); }
;
functor:
- Identifier { $$ = b.tag($1); }
- | literal { $$ = b.literal($1); }
- | Identifier ':' literal { $$ = b.compound($1, $2, $3); }
+ literal { $$ = b.literal($1); }
+ | ID { $$ = b.functor($1); }
+ | ID ':' literal { $$ = b.functor($1, $3); }
| hole
+ | ID ':' hole { $$ = b.functor($1, $3); }
;
hole:
@@ -75,7 +74,7 @@
'@' '{' LiteralInteger '}' { $$ = b.atHole($3); }
;
-repr:
+quant:
'?'
| '+'
| '*'
@@ -200,6 +199,6 @@
/**
*
*/
-static /*package*/ ConstList getTokenNames() {
+static public ConstList getTokenNames() {
return ConstList.fromArray(TheTokens);
}