[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);
 }