[e-cvs] cvs commit: e/src/jsrc/org/quasiliteral/term Functor.java

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Sat, 3 Nov 2001 19:38:12 -0500


markm       01/11/03 19:38:12

  Modified:    src/esrc/org/erights/e/install/props substFromProps.emaker
               src/jsrc Makefile
               src/jsrc/org/erights/e/elang/syntax ELexer.java EParser.java
                        e.y
               src/jsrc/org/erights/e/elib/base SourceSpan.java
               src/jsrc/org/erights/e/elib/tables AtomicTwine.java
                        CompositeTwine.java EmptyTwine.java
                        LocatedTwine.java Twine.java
               src/jsrc/org/quasiliteral/astro AstroToken.java
               src/jsrc/org/quasiliteral/term Functor.java
  Added:       src/jsrc/org/quasiliteral/quasiterm term.y
  Log:
  quasi-term-trees making much progress

Revision  Changes    Path
1.4       +1 -1      e/src/esrc/org/erights/e/install/props/substFromProps.emaker

Index: substFromProps.emaker
===================================================================
RCS file: /cvs/e/src/esrc/org/erights/e/install/props/substFromProps.emaker,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- substFromProps.emaker	2001/03/12 07:01:40	1.3
+++ substFromProps.emaker	2001/11/04 00:38:11	1.4
@@ -6,7 +6,7 @@
         result += left
         def prop := props get(name bare(), null)
         if (null != prop) {
-            result += name infect(prop)
+            result += name infect(prop, false)
         }
         text := right
     }



1.57      +6 -10     e/src/jsrc/Makefile

Index: Makefile
===================================================================
RCS file: /cvs/e/src/jsrc/Makefile,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -r1.56 -r1.57
--- Makefile	2001/11/03 13:32:50	1.56
+++ Makefile	2001/11/04 00:38:11	1.57
@@ -39,30 +39,26 @@
 	find $(ER)/meta/$(ER)/elib -name '*.java' >> files.tmp
 	$(JCOMPILE) @files.tmp
 
-# AST manipulations
-# depends on stl_elib
-_astro:
-	find antlr -name '*.java' > files.tmp
-	find org/quasiliteral -name '*.java' >> files.tmp
-	find org/capml -name '*.java' >> files.tmp
-	$(JCOMPILE) @files.tmp
-
 # tools needed to build elang
 # depends on stl_elib
 elang_builder:
 	find org/erights/build -name '*.java' > files.tmp
 	find org/apache/oro    -name '*.java' >> files.tmp
+	find antlr -name '*.java' >> files.tmp
 	$(JCOMPILE) @files.tmp
 
 # optional: remake the parser from yacc, or just use the generated
 # one, which is included.
 elang_parser:
+	(cd $(TOP)/src/jsrc/org/quasiliteral/quasiterm; $(MAKE) all)
 	(cd $(ER)/elang/syntax; $(MAKE) all)
 
 # space-time-local elang
-# depends on stl_elib, elang_builder, _astro
+# depends on stl_elib, elang_builder
 stl_elang:
 	find $(ER)/elang            -name '*.java' > files.tmp
+	find org/quasiliteral -name '*.java' >> files.tmp
+	find org/capml -name '*.java' >> files.tmp
 	$(JCOMPILE) @files.tmp
 
 # elmer
@@ -96,7 +92,7 @@
 	$(JCOMPILE) @files.tmp
 
 
-pre_parser: setup _develop stl_elib _astro elang_builder
+pre_parser: setup _develop stl_elib elang_builder
 
 post_parser: stl_elang _elmer _extern _vattp _captp _ertp
 



1.60      +21 -20    e/src/jsrc/org/erights/e/elang/syntax/ELexer.java

Index: ELexer.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/ELexer.java,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -r1.59 -r1.60
--- ELexer.java	2001/11/03 13:32:50	1.59
+++ ELexer.java	2001/11/04 00:38:11	1.60
@@ -441,7 +441,7 @@
                     } while (myChar != EOFCHAR &&
                              isIdentifierPart((char)myChar));
                     Twine name = endToken();
-                    String key = name.toLowerCase().substring(1);
+                    String key = name.bare().toLowerCase().substring(1);
                     int tt = EParser.tokenType(key);
                     if (tt != -1) {
                         syntaxError(key + " is a keyword");
@@ -473,7 +473,7 @@
                     } while (myChar != EOFCHAR &&
                              isIdentifierPart((char)myChar));
                     Twine name = endToken();
-                    String key = name.toLowerCase().substring(1);
+                    String key = name.bare().toLowerCase().substring(1);
                     int tt = EParser.tokenType(key);
                     if (tt != -1) {
                         syntaxError(key + " is a keyword");
@@ -861,8 +861,8 @@
         }
         nextChar();
         return new AstroToken(EParser.LiteralChar,
-                             endToken(),
-                             new Character(value));
+                              endToken(),
+                              new Character(value));
     }
 
     /**
@@ -883,7 +883,7 @@
             }
         }
         Twine source = endToken();
-        int ttype = EParser.tokenType(source.toLowerCase());
+        int ttype = EParser.tokenType(source.bare().toLowerCase());
         if (-1 == ttype) {
             ttype = EParser.Identifier;
         }
@@ -978,20 +978,19 @@
             }
         }
         Twine tok = endToken();
-        tok = tok.replaceAll("_", "");
-        String str = tok.bare();
+        String str = tok.replaceAll("_", "").bare();
         if (floating) {
             return new AstroToken(EParser.LiteralFloat64,
-                                 tok,
-                                 Double.valueOf(str));
+                                  tok,
+                                  Double.valueOf(str));
         } else {
             if (radix == 16) {
                 //remove the leading "0x" to make BigInteger happy
                 str = str.substring(2);
             }
             return new AstroToken(EParser.LiteralInteger,
-                                 tok,
-                                 new BigInteger(str, radix));
+                                  tok,
+                                  new BigInteger(str, radix));
         }
     }
 
@@ -1063,8 +1062,8 @@
                 Twine closer = endToken();
                 myIndenter.pop('`', closer);
                 return new AstroToken(EParser.QuasiClose,
-                                     closer,
-                                     buf.toString());
+                                      closer,
+                                      buf.toString());
 
             } else if (peekChar('`')) {
                 //terminal '$' or '@' before a '`' is eaten and added to the
@@ -1088,8 +1087,8 @@
                 //interpolated '$' or '@' is neither eaten nor added to the
                 //value of the resulting QuasiOpen token.
                 return new AstroToken(EParser.QuasiOpen,
-                                     openner,
-                                     buf.toString());
+                                      openner,
+                                      buf.toString());
             }
         }
     }
@@ -1169,8 +1168,8 @@
         Twine closer = endToken();
         myIndenter.pop('"', closer);
         return new AstroToken(EParser.LiteralString,
-                             closer,
-                             value.toString());
+                              closer,
+                              value.toString());
     }
 
     /**
@@ -1242,9 +1241,11 @@
                 AstroToken t;
                 do {
                     t = lex.nextToken();
-                    stdout.println(t);
-                    if (t.getType() == '\n') {
-                        stdout.println(lex.myIndenter.toString());
+                    stdout.println(t.asFunctor(EParser.getTokenNames()));
+                    if (t.getType() == EParser.EOL) {
+                        stdout.print("stack: ",
+                                     lex.myIndenter.toString(),
+                                     "\n");
                     }
                 } while (t.getType() != EParser.EOFTOK);
                 return;



1.97      +270 -262  e/src/jsrc/org/erights/e/elang/syntax/EParser.java

Index: EParser.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/EParser.java,v
retrieving revision 1.96
retrieving revision 1.97
diff -u -r1.96 -r1.97
--- EParser.java	2001/11/03 13:32:50	1.96
+++ EParser.java	2001/11/04 00:38:11	1.97
@@ -23,12 +23,13 @@
 import org.erights.e.elang.interp.Interp;
 import org.erights.e.elib.base.Ejector;
 import org.erights.e.elib.prim.StaticMaker;
+import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.tables.ConstMap;
 import org.erights.e.elib.tables.IdentityCacheTable;
 import org.erights.e.elib.tables.IntTable;
 import org.erights.e.elib.tables.Twine;
- import org.quasiliteral.astro.AstroToken;
-//#line 29 "EParser.java"
+import org.quasiliteral.astro.AstroToken;
+//#line 30 "EParser.java"
 
 
 
@@ -1133,7 +1134,7 @@
 "reserved : WSTRING",
 };
 
-//#line 1182 "e.y"
+//#line 1183 "e.y"
 
 /**
  *
@@ -1141,7 +1142,7 @@
 static public final StaticMaker EParserMaker =
     StaticMaker.make(EParser.class);
 
-/**
+/** 
  * caches previous simple parses (as is used for quasi-parsing)
  */
 static private IdentityCacheTable OurCache =
@@ -1150,7 +1151,7 @@
 /**
  *
  */
-static private final ConstMap DefaultProps =
+static private final ConstMap DefaultProps = 
   ConstMap.fromProperties(System.getProperties());
 
 
@@ -1158,7 +1159,7 @@
 /** contains all the tokens after yylval */
 private ELexer myLexer;
 
-/**
+/** 
  * Do we escape after parsing only one expression, or do we parse the
  * entire input?
  */
@@ -1260,7 +1261,7 @@
 
 /**
  * If the input is empty, returns the null expression e`null`, rather
- * than null.
+ * than null. 
  */
 public ENode parse() {
     ENode result = optParse();
@@ -1321,7 +1322,7 @@
     int ttype = ((AstroToken)yylval).getType();
     if (EParser.EOFTOK == ttype && "syntax error".equals(s)) {
         myLexer.needMore("Unexpected EOF");
-
+        
     } else {
         syntaxError(s);
     }
@@ -1593,6 +1594,13 @@
 /**
  *
  */
+static /*package*/ ConstList getTokenNames() {
+    return ConstList.fromArray(TheTokens);
+}
+
+/**
+ *
+ */
 static private IntTable TheTokenTable = null;
 
 /**
@@ -1622,7 +1630,7 @@
 /**
  * These are the tokens that may appear at the end of a line, in which
  * case the next line is a (to be indented) continuation of the
- * expression.
+ * expression. 
  * <p>
  * Note that &gt; isn't on the list because of its role in closing a
  * calculated URI expression.
@@ -1700,7 +1708,7 @@
 static public boolean isContinuer(int tokenType) {
     return TheContinuers[tokenType];
 }
-//#line 5619 "EParser.java"
+//#line 5627 "EParser.java"
 //###############################################################
 // method: yylexdebug : check lexer state
 //###############################################################
@@ -1720,7 +1728,7 @@
 //###############################################################
 // method: yyparse : parse input and execute indicated items
 //###############################################################
-int yyparse()
+int yyparse() 
 {
 int yyn;       //next next thing to do
 int yym;       //
@@ -1736,7 +1744,7 @@
   while (true) //until parsing is done, either correctly, or w/error
     {
     doaction=true;
-    if (yydebug) debug("loop");
+    if (yydebug) debug("loop"); 
     //#### NEXT ACTION (from reduction table)
     for (yyn=yydefred[yystate];yyn==0;yyn=yydefred[yystate])
       {
@@ -1847,400 +1855,400 @@
       {
 //########## USER-SUPPLIED ACTIONS ##########
 case 1:
-//#line 154 "e.y"
+//#line 155 "e.y"
 { myEscape.run(null); }
 break;
 case 2:
-//#line 155 "e.y"
+//#line 156 "e.y"
 { myEscape.run(val_peek(0)); }
 break;
 case 3:
-//#line 157 "e.y"
+//#line 158 "e.y"
 { myEscape.run(val_peek(0)); }
 break;
 case 5:
-//#line 165 "e.y"
+//#line 166 "e.y"
 { pocket("define"); }
 break;
 case 6:
-//#line 174 "e.y"
+//#line 175 "e.y"
 { yyval = val_peek(1); }
 break;
 case 7:
-//#line 178 "e.y"
+//#line 179 "e.y"
 { yyval = val_peek(1); }
 break;
 case 9:
-//#line 189 "e.y"
+//#line 190 "e.y"
 { yyval = sequence(val_peek(2), val_peek(0)); }
 break;
 case 11:
-//#line 194 "e.y"
+//#line 195 "e.y"
 { yyval = sequence(val_peek(2), val_peek(0)); }
 break;
 case 12:
-//#line 202 "e.y"
+//#line 203 "e.y"
 { yyval = oneExpr(val_peek(0)); }
 break;
 case 16:
-//#line 217 "e.y"
+//#line 218 "e.y"
 { yyval = sequence(val_peek(2), val_peek(0)); }
 break;
 case 17:
-//#line 218 "e.y"
+//#line 219 "e.y"
 { yyval = forward(val_peek(0)); }
 break;
 case 18:
-//#line 233 "e.y"
+//#line 234 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 21:
-//#line 238 "e.y"
+//#line 239 "e.y"
 { yyval = assign(val_peek(2),     val_peek(0)); }
 break;
 case 22:
-//#line 239 "e.y"
+//#line 240 "e.y"
 { yyval = update(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 23:
-//#line 240 "e.y"
+//#line 241 "e.y"
 { yyval = assAsr(val_peek(2),     val_peek(0)); }
 break;
 case 24:
-//#line 241 "e.y"
+//#line 242 "e.y"
 { yyval = update(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 25:
-//#line 243 "e.y"
+//#line 244 "e.y"
 { yyval = define(val_peek(2), val_peek(0)); }
 break;
 case 26:
-//#line 244 "e.y"
+//#line 245 "e.y"
 { yyval = define(val_peek(2), val_peek(0)); }
 break;
 case 27:
-//#line 245 "e.y"
+//#line 246 "e.y"
 { yyval = define(val_peek(2), val_peek(0)); }
 break;
 case 29:
-//#line 254 "e.y"
+//#line 255 "e.y"
 { yyval = condOr(val_peek(2), val_peek(0)); }
 break;
 case 31:
-//#line 263 "e.y"
+//#line 264 "e.y"
 { yyval = condAnd(val_peek(2), val_peek(0)); }
 break;
 case 33:
-//#line 272 "e.y"
+//#line 273 "e.y"
 { yyval = same(val_peek(2), val_peek(0)); }
 break;
 case 34:
-//#line 273 "e.y"
+//#line 274 "e.y"
 { yyval = not(same(val_peek(2), val_peek(0))); }
 break;
 case 35:
-//#line 274 "e.y"
+//#line 275 "e.y"
 { yyval = call(val_peek(2), "and", val_peek(0)); }
 break;
 case 36:
-//#line 275 "e.y"
+//#line 276 "e.y"
 { yyval = call(val_peek(2), "or", val_peek(0)); }
 break;
 case 37:
-//#line 276 "e.y"
+//#line 277 "e.y"
 { yyval = call(val_peek(2), "xor", val_peek(0)); }
 break;
 case 38:
-//#line 277 "e.y"
+//#line 278 "e.y"
 { yyval = call(val_peek(2), "butNot", val_peek(0)); }
 break;
 case 39:
-//#line 279 "e.y"
+//#line 280 "e.y"
 { yyval = matchBind(val_peek(2), val_peek(0)); }
 break;
 case 40:
-//#line 280 "e.y"
+//#line 281 "e.y"
 { yyval = not(matchBind(val_peek(2), val_peek(0))); }
 break;
 case 41:
-//#line 292 "e.y"
+//#line 293 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 44:
-//#line 297 "e.y"
+//#line 298 "e.y"
 { yyval = lessThan(val_peek(2), val_peek(0)); }
 break;
 case 45:
-//#line 298 "e.y"
+//#line 299 "e.y"
 { yyval = leq(val_peek(2), val_peek(0)); }
 break;
 case 46:
-//#line 299 "e.y"
+//#line 300 "e.y"
 { yyval = asBigAs(val_peek(2), val_peek(0)); }
 break;
 case 47:
-//#line 300 "e.y"
+//#line 301 "e.y"
 { yyval = geq(val_peek(2), val_peek(0)); }
 break;
 case 48:
-//#line 301 "e.y"
+//#line 302 "e.y"
 { yyval = greaterThan(val_peek(2), val_peek(0)); }
 break;
 case 50:
-//#line 310 "e.y"
+//#line 311 "e.y"
 { yyval = thru(val_peek(2), val_peek(0)); }
 break;
 case 51:
-//#line 311 "e.y"
+//#line 312 "e.y"
 { yyval = till(val_peek(2), val_peek(0)); }
 break;
 case 53:
-//#line 320 "e.y"
+//#line 321 "e.y"
 { yyval = call(val_peek(2), "shiftLeft", val_peek(0)); }
 break;
 case 54:
-//#line 321 "e.y"
+//#line 322 "e.y"
 { yyval = call(val_peek(2), "shiftLeft",
                                             list(call(val_peek(0), "negate", list())));
                                 }
 break;
 case 55:
-//#line 331 "e.y"
+//#line 332 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 58:
-//#line 336 "e.y"
+//#line 337 "e.y"
 { yyval = call(val_peek(2), "add", val_peek(0)); }
 break;
 case 59:
-//#line 337 "e.y"
+//#line 338 "e.y"
 { yyval = call(val_peek(2), "subtract", val_peek(0)); }
 break;
 case 60:
-//#line 345 "e.y"
+//#line 346 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 63:
-//#line 350 "e.y"
+//#line 351 "e.y"
 { yyval = call(val_peek(2), "multiply", val_peek(0)); }
 break;
 case 64:
-//#line 351 "e.y"
+//#line 352 "e.y"
 { yyval = call(val_peek(2), "approxDivide", val_peek(0)); }
 break;
 case 65:
-//#line 352 "e.y"
+//#line 353 "e.y"
 { yyval = call(val_peek(2), "floorDivide", val_peek(0)); }
 break;
 case 66:
-//#line 353 "e.y"
+//#line 354 "e.y"
 { yyval = call(val_peek(2), "remainder", val_peek(0)); }
 break;
 case 67:
-//#line 354 "e.y"
+//#line 355 "e.y"
 { yyval = mod(val_peek(2), val_peek(0)); }
 break;
 case 68:
-//#line 362 "e.y"
+//#line 363 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 71:
-//#line 367 "e.y"
+//#line 368 "e.y"
 { yyval = call(val_peek(2), "pow", val_peek(0)); }
 break;
 case 72:
-//#line 376 "e.y"
+//#line 377 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 75:
-//#line 381 "e.y"
+//#line 382 "e.y"
 { yyval = call(val_peek(0), "not", list()); }
 break;
 case 76:
-//#line 382 "e.y"
+//#line 383 "e.y"
 { yyval = call(val_peek(0), "complement", list());}
 break;
 case 77:
-//#line 383 "e.y"
+//#line 384 "e.y"
 { yyval = call(val_peek(0), "negate", list()); }
 break;
 case 78:
-//#line 384 "e.y"
+//#line 385 "e.y"
 { yyval = slotExpr(val_peek(0)); }
 break;
 case 81:
-//#line 396 "e.y"
+//#line 397 "e.y"
 { yyval = call(val_peek(3), "get", val_peek(1)); }
 break;
 case 82:
-//#line 397 "e.y"
+//#line 398 "e.y"
 { yyval = send(val_peek(3), val_peek(1), val_peek(0)); }
 break;
 case 83:
-//#line 398 "e.y"
+//#line 399 "e.y"
 { yyval = send(val_peek(2), "run", val_peek(0)); }
 break;
 case 84:
-//#line 400 "e.y"
+//#line 401 "e.y"
 { pocket("no-paren-call");
                                           yyval = send(val_peek(2), val_peek(0), list()); }
 break;
 case 85:
-//#line 402 "e.y"
+//#line 403 "e.y"
 { pocket("no-paren-call");
                                           yyval = call(val_peek(1), val_peek(0), list()); }
 break;
 case 86:
-//#line 404 "e.y"
+//#line 405 "e.y"
 { pocket("dot-props");
                                           yyval = property(val_peek(2), val_peek(0), list()); }
 break;
 case 87:
-//#line 406 "e.y"
+//#line 407 "e.y"
 { pocket("dot-props");
                                           yyval = property(val_peek(3), val_peek(1), val_peek(0)); }
 break;
 case 88:
-//#line 414 "e.y"
+//#line 415 "e.y"
 { yyval = doMeta(val_peek(1), "run", val_peek(0)); }
 break;
 case 89:
-//#line 415 "e.y"
+//#line 416 "e.y"
 { yyval = doMeta(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 90:
-//#line 416 "e.y"
+//#line 417 "e.y"
 { yyval = doMetaSend(val_peek(2), "run", val_peek(0)); }
 break;
 case 91:
-//#line 417 "e.y"
+//#line 418 "e.y"
 { yyval = doMetaSend(val_peek(3), val_peek(1), val_peek(0)); }
 break;
 case 92:
-//#line 419 "e.y"
+//#line 420 "e.y"
 { pocket("no-paren-call");
                                           yyval = doMeta(val_peek(1), val_peek(0), list()); }
 break;
 case 93:
-//#line 421 "e.y"
+//#line 422 "e.y"
 { pocket("no-paren-call");
                                           yyval = doMetaSend(val_peek(2), val_peek(0), list()); }
 break;
 case 95:
-//#line 435 "e.y"
+//#line 436 "e.y"
 { yyval = call(val_peek(1), "run", val_peek(0)); }
 break;
 case 96:
-//#line 436 "e.y"
+//#line 437 "e.y"
 { yyval = call(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 97:
-//#line 444 "e.y"
+//#line 445 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 98:
-//#line 445 "e.y"
+//#line 446 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 99:
-//#line 446 "e.y"
+//#line 447 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 100:
-//#line 447 "e.y"
+//#line 448 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 101:
-//#line 448 "e.y"
+//#line 449 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 103:
-//#line 452 "e.y"
+//#line 453 "e.y"
 { yyval = uriExpr(val_peek(0)); }
 break;
 case 104:
-//#line 453 "e.y"
+//#line 454 "e.y"
 { yyval = uriExpr(val_peek(2),val_peek(1)); }
 break;
 case 105:
-//#line 455 "e.y"
+//#line 456 "e.y"
 { yyval = quasiExpr(val_peek(1),val_peek(0)); }
 break;
 case 107:
-//#line 458 "e.y"
+//#line 459 "e.y"
 { yyval = tuple(val_peek(1)); }
 break;
 case 108:
-//#line 459 "e.y"
+//#line 460 "e.y"
 { yyval = map(val_peek(1)); }
 break;
 case 109:
-//#line 461 "e.y"
+//#line 462 "e.y"
 { yyval = hide(val_peek(0)); }
 break;
 case 110:
-//#line 463 "e.y"
+//#line 464 "e.y"
 { yyval = escape(val_peek(1),val_peek(0)); }
 break;
 case 111:
-//#line 465 "e.y"
+//#line 466 "e.y"
 { yyval = whilex(val_peek(1),val_peek(0)); }
 break;
 case 112:
-//#line 467 "e.y"
+//#line 468 "e.y"
 { yyval = switchx(val_peek(2),val_peek(1)); }
 break;
 case 113:
-//#line 469 "e.y"
+//#line 470 "e.y"
 { yyval = tryx(val_peek(2),val_peek(1),val_peek(0)); }
 break;
 case 118:
-//#line 477 "e.y"
+//#line 478 "e.y"
 { yyval = quasiLiteralExpr(val_peek(1)); }
 break;
 case 119:
-//#line 478 "e.y"
+//#line 479 "e.y"
 { yyval = quasiLiteralExpr(val_peek(0)); }
 break;
 case 120:
-//#line 479 "e.y"
+//#line 480 "e.y"
 { yyval = quasiLiteralExpr(); }
 break;
 case 121:
-//#line 480 "e.y"
+//#line 481 "e.y"
 { yyval = quasiPatternExpr(val_peek(1)); }
 break;
 case 122:
-//#line 481 "e.y"
+//#line 482 "e.y"
 { yyval = quasiPatternExpr(val_peek(0)); }
 break;
 case 123:
-//#line 484 "e.y"
+//#line 485 "e.y"
 { reserved("select"); }
 break;
 case 124:
-//#line 485 "e.y"
+//#line 486 "e.y"
 { pocket("typedef");
                                                   yyval = val_peek(0); }
 break;
 case 126:
-//#line 494 "e.y"
+//#line 495 "e.y"
 { yyval = object(val_peek(1), val_peek(0)); }
 break;
 case 127:
-//#line 495 "e.y"
+//#line 496 "e.y"
 { yyval = methObject(val_peek(3),val_peek(1),val_peek(0)); }
 break;
 case 128:
-//#line 496 "e.y"
+//#line 497 "e.y"
 { yyval = thunk(val_peek(0)); }
 break;
 case 129:
-//#line 498 "e.y"
+//#line 499 "e.y"
 { yyval = classExpr(val_peek(1),val_peek(0)); }
 break;
 case 130:
-//#line 500 "e.y"
+//#line 501 "e.y"
 { pocket("anon-lambda");
                                           yyval = methObject(audits(ignore(),
                                                                  list()),
@@ -2248,626 +2256,626 @@
                                                           val_peek(0)); }
 break;
 case 131:
-//#line 505 "e.y"
+//#line 506 "e.y"
 { pocket("anon-lambda");
                                           yyval = thunk(val_peek(0)); }
 break;
 case 132:
-//#line 513 "e.y"
+//#line 514 "e.y"
 { yyval = noun(val_peek(0)); }
 break;
 case 133:
-//#line 522 "e.y"
+//#line 523 "e.y"
 { yyval = val_peek(1); }
 break;
 case 134:
-//#line 531 "e.y"
+//#line 532 "e.y"
 { yyval = ifx(val_peek(1), val_peek(0)); }
 break;
 case 135:
-//#line 532 "e.y"
+//#line 533 "e.y"
 { yyval = ifx(val_peek(3), val_peek(2), val_peek(0)); }
 break;
 case 136:
-//#line 533 "e.y"
+//#line 534 "e.y"
 { yyval = ifx(val_peek(4), val_peek(3), val_peek(0)); }
 break;
 case 137:
-//#line 541 "e.y"
+//#line 542 "e.y"
 { yyval = forx(val_peek(5),val_peek(3),val_peek(1)); }
 break;
 case 138:
-//#line 549 "e.y"
+//#line 550 "e.y"
 { yyval = when(val_peek(3),val_peek(2),val_peek(1),val_peek(0)); }
 break;
 case 139:
-//#line 559 "e.y"
+//#line 560 "e.y"
 { yyval = macro(val_peek(4), val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 140:
-//#line 561 "e.y"
+//#line 562 "e.y"
 { yyval = macro(val_peek(5), val_peek(3), val_peek(2), val_peek(0)); }
 break;
 case 141:
-//#line 565 "e.y"
+//#line 566 "e.y"
 { yyval = null; }
 break;
 case 142:
-//#line 567 "e.y"
+//#line 568 "e.y"
 { yyval = macro(val_peek(5), val_peek(3), val_peek(2), val_peek(1)); }
 break;
 case 143:
-//#line 569 "e.y"
+//#line 570 "e.y"
 { yyval = macro(val_peek(5), val_peek(3), val_peek(2), val_peek(0)); }
 break;
 case 144:
-//#line 577 "e.y"
+//#line 578 "e.y"
 { yyval = null; }
 break;
 case 147:
-//#line 584 "e.y"
+//#line 585 "e.y"
 { yyval = noun("simple__quasiParser"); }
 break;
 case 148:
-//#line 585 "e.y"
+//#line 586 "e.y"
 { yyval = noun(val_peek(0) +  "__quasiParser"); }
 break;
 case 149:
-//#line 586 "e.y"
+//#line 587 "e.y"
 { yyval = val_peek(1); }
 break;
 case 150:
-//#line 590 "e.y"
+//#line 591 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 151:
-//#line 591 "e.y"
+//#line 592 "e.y"
 { yyval = with(val_peek(1), val_peek(0)); }
 break;
 case 152:
-//#line 595 "e.y"
+//#line 596 "e.y"
 { yyval = list(val_peek(1), val_peek(0)); }
 break;
 case 153:
-//#line 596 "e.y"
+//#line 597 "e.y"
 { yyval = with(with(val_peek(2), val_peek(1)), val_peek(0)); }
 break;
 case 154:
-//#line 600 "e.y"
+//#line 601 "e.y"
 { yyval = dollarNoun(val_peek(0)); }
 break;
 case 155:
-//#line 601 "e.y"
+//#line 602 "e.y"
 { yyval = val_peek(1); }
 break;
 case 158:
-//#line 619 "e.y"
+//#line 620 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 159:
-//#line 620 "e.y"
+//#line 621 "e.y"
 { yyval = with(val_peek(3), val_peek(0)); }
 break;
 case 161:
-//#line 630 "e.y"
+//#line 631 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 162:
-//#line 631 "e.y"
+//#line 632 "e.y"
 { yyval = with(val_peek(3), val_peek(0)); }
 break;
 case 163:
-//#line 638 "e.y"
+//#line 639 "e.y"
 { yyval = new Assoc(ignore(), val_peek(0)); }
 break;
 case 165:
-//#line 643 "e.y"
+//#line 644 "e.y"
 { yyval = new Assoc(val_peek(2), val_peek(0)); }
 break;
 case 166:
-//#line 644 "e.y"
+//#line 645 "e.y"
 { reserved("var-extract-pattern"); }
 break;
 case 168:
-//#line 649 "e.y"
+//#line 650 "e.y"
 { yyval = suchThat(val_peek(2), val_peek(0)); }
 break;
 case 169:
-//#line 651 "e.y"
+//#line 652 "e.y"
 { reserved("meta pattern"); }
 break;
 case 171:
-//#line 656 "e.y"
+//#line 657 "e.y"
 { yyval = listPattern(val_peek(1)); }
 break;
 case 172:
-//#line 657 "e.y"
+//#line 658 "e.y"
 { yyval = cdrPattern(val_peek(3), val_peek(0)); }
 break;
 case 173:
-//#line 659 "e.y"
+//#line 660 "e.y"
 { reserved("map pattern"); }
 break;
 case 174:
-//#line 660 "e.y"
+//#line 661 "e.y"
 { reserved("map pattern"); }
 break;
 case 176:
-//#line 665 "e.y"
+//#line 666 "e.y"
 { yyval = patternEquals(val_peek(0)); }
 break;
 case 178:
-//#line 670 "e.y"
+//#line 671 "e.y"
 { yyval = quasiPattern(val_peek(1), val_peek(0)); }
 break;
 case 179:
-//#line 674 "e.y"
+//#line 675 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 180:
-//#line 675 "e.y"
+//#line 676 "e.y"
 { yyval = with(val_peek(1), val_peek(0)); }
 break;
 case 181:
-//#line 679 "e.y"
+//#line 680 "e.y"
 { yyval = list(val_peek(1), val_peek(0)); }
 break;
 case 182:
-//#line 680 "e.y"
+//#line 681 "e.y"
 { yyval = with(with(val_peek(2), val_peek(1)), val_peek(0));}
 break;
 case 185:
-//#line 689 "e.y"
+//#line 690 "e.y"
 { yyval = atNoun(val_peek(0)); }
 break;
 case 186:
-//#line 690 "e.y"
+//#line 691 "e.y"
 { yyval = val_peek(1); }
 break;
 case 187:
-//#line 703 "e.y"
+//#line 704 "e.y"
 { yyval = finalPattern(val_peek(2), val_peek(0)); }
 break;
 case 188:
-//#line 704 "e.y"
+//#line 705 "e.y"
 { yyval = finalPattern(val_peek(0)); }
 break;
 case 189:
-//#line 705 "e.y"
+//#line 706 "e.y"
 { yyval = slotDefiner(val_peek(0)); }
 break;
 case 190:
-//#line 706 "e.y"
+//#line 707 "e.y"
 { yyval = ignore(); }
 break;
 case 191:
-//#line 707 "e.y"
+//#line 708 "e.y"
 { reserved("anon guard"); }
 break;
 case 194:
-//#line 711 "e.y"
+//#line 712 "e.y"
 { yyval = quasiLiteralPatt(val_peek(1)); }
 break;
 case 195:
-//#line 712 "e.y"
+//#line 713 "e.y"
 { yyval = quasiPatternPatt(val_peek(1)); }
 break;
 case 196:
-//#line 716 "e.y"
+//#line 717 "e.y"
 { yyval = bindDefiner(val_peek(2), val_peek(0)); }
 break;
 case 197:
-//#line 717 "e.y"
+//#line 718 "e.y"
 { yyval = bindDefiner(val_peek(0)); }
 break;
 case 198:
-//#line 721 "e.y"
+//#line 722 "e.y"
 { yyval = varPattern(val_peek(2), val_peek(0)); }
 break;
 case 199:
-//#line 722 "e.y"
+//#line 723 "e.y"
 { yyval = varPattern(val_peek(0)); }
 break;
 case 200:
-//#line 731 "e.y"
+//#line 732 "e.y"
 { yyval = finalPattern(val_peek(0)); }
 break;
 case 201:
-//#line 732 "e.y"
+//#line 733 "e.y"
 { yyval = ignore(); }
 break;
 case 202:
-//#line 733 "e.y"
+//#line 734 "e.y"
 { yyval = bindDefiner(val_peek(0)); }
 break;
 case 203:
-//#line 734 "e.y"
+//#line 735 "e.y"
 { yyval = varPattern(val_peek(0)); }
 break;
 case 204:
-//#line 735 "e.y"
+//#line 736 "e.y"
 { yyval = quasiLiteralPatt(val_peek(1)); }
 break;
 case 205:
-//#line 736 "e.y"
+//#line 737 "e.y"
 { yyval = quasiPatternPatt(val_peek(1)); }
 break;
 case 207:
-//#line 753 "e.y"
+//#line 754 "e.y"
 { yyval = val_peek(0); }
 break;
 case 208:
-//#line 754 "e.y"
+//#line 755 "e.y"
 { yyval = bindDefiner(val_peek(0)); }
 break;
 case 209:
-//#line 755 "e.y"
+//#line 756 "e.y"
 { yyval = varPattern(val_peek(0)); }
 break;
 case 210:
-//#line 762 "e.y"
+//#line 763 "e.y"
 { yyval = audits(val_peek(0), list()); }
 break;
 case 211:
-//#line 763 "e.y"
+//#line 764 "e.y"
 { pocket("auditors");
                                                   yyval = audits(val_peek(2), val_peek(0)); }
 break;
 case 212:
-//#line 771 "e.y"
+//#line 772 "e.y"
 { yyval = audits(val_peek(0), list()); }
 break;
 case 213:
-//#line 772 "e.y"
+//#line 773 "e.y"
 { pocket("auditors");
                                                   yyval = audits(val_peek(2), val_peek(0)); }
 break;
 case 214:
-//#line 777 "e.y"
+//#line 778 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 215:
-//#line 778 "e.y"
+//#line 779 "e.y"
 { yyval = with(val_peek(3), val_peek(0)); }
 break;
 case 216:
-//#line 790 "e.y"
+//#line 791 "e.y"
 { yyval = list(); }
 break;
 case 217:
-//#line 791 "e.y"
+//#line 792 "e.y"
 { yyval = append(list(val_peek(3)),val_peek(1)); }
 break;
 case 220:
-//#line 805 "e.y"
+//#line 806 "e.y"
 { yyval = method(val_peek(1), val_peek(0)); }
 break;
 case 221:
-//#line 807 "e.y"
+//#line 808 "e.y"
 { reserved("fields"); }
 break;
 case 222:
-//#line 808 "e.y"
+//#line 809 "e.y"
 { reserved("on event"); }
 break;
 case 223:
-//#line 809 "e.y"
+//#line 810 "e.y"
 { reserved("sealed meta"); }
 break;
 case 224:
-//#line 810 "e.y"
+//#line 811 "e.y"
 { reserved("sealed meta"); }
 break;
 case 225:
-//#line 818 "e.y"
+//#line 819 "e.y"
 { yyval = methHead("run", val_peek(2), val_peek(0)); }
 break;
 case 226:
-//#line 819 "e.y"
+//#line 820 "e.y"
 { yyval = methHead(val_peek(4), val_peek(2), val_peek(0)); }
 break;
 case 227:
-//#line 821 "e.y"
+//#line 822 "e.y"
 { pocket("no-paren-method");
                                                yyval = methHead(val_peek(1), list(), val_peek(0)); }
 break;
 case 228:
-//#line 830 "e.y"
+//#line 831 "e.y"
 { yyval = methHead("run", val_peek(2), val_peek(0)); }
 break;
 case 229:
-//#line 832 "e.y"
+//#line 833 "e.y"
 { pocket("one-method-object");
                                                yyval = methHead(val_peek(4), val_peek(2), val_peek(0)); }
 break;
 case 230:
-//#line 834 "e.y"
+//#line 835 "e.y"
 { pocket("no-paren-method");
                                                yyval = methHead(val_peek(1), list(), val_peek(0)); }
 break;
 case 231:
-//#line 843 "e.y"
+//#line 844 "e.y"
 { yyval = list(val_peek(5), val_peek(2), val_peek(0)); }
 break;
 case 232:
-//#line 853 "e.y"
+//#line 854 "e.y"
 { yyval = matcher(val_peek(1), val_peek(0)); }
 break;
 case 233:
-//#line 862 "e.y"
+//#line 863 "e.y"
 { yyval = delegatex(val_peek(0)); }
 break;
 case 234:
-//#line 869 "e.y"
+//#line 870 "e.y"
 { yyval = VOID; }
 break;
 case 235:
-//#line 870 "e.y"
+//#line 871 "e.y"
 { yyval = val_peek(0); }
 break;
 case 236:
-//#line 874 "e.y"
+//#line 875 "e.y"
 { yyval = val_peek(1); }
 break;
 case 237:
-//#line 883 "e.y"
+//#line 884 "e.y"
 { yyval = list(val_peek(7), val_peek(5), val_peek(2), val_peek(0)); }
 break;
 case 238:
-//#line 886 "e.y"
+//#line 887 "e.y"
 { pocket("when-clauses");
                                                   yyval = list(val_peek(5), val_peek(2), val_peek(0)); }
 break;
 case 239:
-//#line 891 "e.y"
+//#line 892 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 240:
-//#line 892 "e.y"
+//#line 893 "e.y"
 { yyval = with(val_peek(2), val_peek(0)); }
 break;
 case 241:
-//#line 896 "e.y"
+//#line 897 "e.y"
 { list(val_peek(2), val_peek(0)); }
 break;
 case 246:
-//#line 914 "e.y"
+//#line 915 "e.y"
 { yyval = list(); }
 break;
 case 247:
-//#line 918 "e.y"
+//#line 919 "e.y"
 { yyval = list(); }
 break;
 case 248:
-//#line 923 "e.y"
+//#line 924 "e.y"
 { yyval = val_peek(1); }
 break;
 case 249:
-//#line 928 "e.y"
+//#line 929 "e.y"
 { pocket("lambda-args");
                                           yyval = with(val_peek(1), val_peek(0)); }
 break;
 case 252:
-//#line 938 "e.y"
+//#line 939 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 253:
-//#line 939 "e.y"
+//#line 940 "e.y"
 { yyval = with(val_peek(2), val_peek(0)); }
 break;
 case 254:
-//#line 944 "e.y"
+//#line 945 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 255:
-//#line 945 "e.y"
+//#line 946 "e.y"
 { yyval = with(val_peek(2), val_peek(0)); }
 break;
 case 256:
-//#line 949 "e.y"
+//#line 950 "e.y"
 { yyval = new Assoc(val_peek(2), val_peek(0)); }
 break;
 case 257:
-//#line 950 "e.y"
+//#line 951 "e.y"
 { reserved("export binding"); }
 break;
 case 259:
-//#line 965 "e.y"
+//#line 966 "e.y"
 { yyval = hilbert(val_peek(0)); }
 break;
 case 260:
-//#line 972 "e.y"
+//#line 973 "e.y"
 { yyval = ((AstroToken)val_peek(0)).getText(); }
 break;
 case 261:
-//#line 973 "e.y"
+//#line 974 "e.y"
 { reserved("keyword \"" +
                                                    ((AstroToken)val_peek(0)).getText() +
                                                    "\""); }
 break;
 case 262:
-//#line 989 "e.y"
+//#line 990 "e.y"
 { yyval = "add"; }
 break;
 case 263:
-//#line 990 "e.y"
+//#line 991 "e.y"
 { yyval = "and"; }
 break;
 case 264:
-//#line 991 "e.y"
+//#line 992 "e.y"
 { yyval = "approxDivide"; }
 break;
 case 265:
-//#line 992 "e.y"
+//#line 993 "e.y"
 { yyval = "floorDivide"; }
 break;
 case 266:
-//#line 993 "e.y"
+//#line 994 "e.y"
 { yyval = "shiftLeft"; }
 break;
 case 267:
-//#line 994 "e.y"
+//#line 995 "e.y"
 { yyval = "remainder"; }
 break;
 case 268:
-//#line 995 "e.y"
+//#line 996 "e.y"
 { yyval = "mod"; }
 break;
 case 269:
-//#line 996 "e.y"
+//#line 997 "e.y"
 { yyval = "multiply"; }
 break;
 case 270:
-//#line 997 "e.y"
+//#line 998 "e.y"
 { yyval = "or"; }
 break;
 case 271:
-//#line 998 "e.y"
+//#line 999 "e.y"
 { yyval = "pow"; }
 break;
 case 272:
-//#line 999 "e.y"
+//#line 1000 "e.y"
 { yyval = "subtract"; }
 break;
 case 273:
-//#line 1000 "e.y"
+//#line 1001 "e.y"
 { yyval = "xor"; }
 break;
 case 274:
-//#line 1009 "e.y"
+//#line 1010 "e.y"
 { yyval = NULL; }
 break;
 case 275:
-//#line 1010 "e.y"
+//#line 1011 "e.y"
 { yyval = val_peek(3); }
 break;
 case 276:
-//#line 1014 "e.y"
+//#line 1015 "e.y"
 { yyval = val_peek(1); }
 break;
 case 277:
-//#line 1019 "e.y"
+//#line 1020 "e.y"
 { yyval = eScript(val_peek(2), optMatcher(val_peek(1))); }
 break;
 case 278:
-//#line 1021 "e.y"
+//#line 1022 "e.y"
 { pocket("plumbing");
                                   yyval = eScript(null, val_peek(0)); }
 break;
 case 279:
-//#line 1023 "e.y"
+//#line 1024 "e.y"
 { pocket("plumbing");
                                   yyval = eScript(null, val_peek(0)); }
 break;
 case 281:
-//#line 1033 "e.y"
+//#line 1034 "e.y"
 { yyval = with(val_peek(2), val_peek(1)); }
 break;
 case 283:
-//#line 1038 "e.y"
+//#line 1039 "e.y"
 { yyval = with(val_peek(2), val_peek(1)); }
 break;
 case 285:
-//#line 1043 "e.y"
+//#line 1044 "e.y"
 { yyval = with(val_peek(2), val_peek(1)); }
 break;
 case 288:
-//#line 1060 "e.y"
+//#line 1061 "e.y"
 { yyval = with(val_peek(1), val_peek(0)); }
 break;
 case 289:
-//#line 1064 "e.y"
+//#line 1065 "e.y"
 { yyval = matcher(val_peek(1), val_peek(0)); }
 break;
 case 290:
-//#line 1071 "e.y"
+//#line 1072 "e.y"
 { yyval = null; }
 break;
 case 291:
-//#line 1072 "e.y"
+//#line 1073 "e.y"
 { yyval = val_peek(0); }
 break;
 case 292:
-//#line 1083 "e.y"
+//#line 1084 "e.y"
 { yyval = oType(val_peek(4), val_peek(1)); }
 break;
 case 293:
-//#line 1084 "e.y"
+//#line 1085 "e.y"
 { yyval = oType(val_peek(2), list(val_peek(1))); }
 break;
 case 297:
-//#line 1091 "e.y"
+//#line 1092 "e.y"
 { yyval = with(val_peek(3),val_peek(1)); }
 break;
 case 298:
-//#line 1095 "e.y"
+//#line 1096 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 299:
-//#line 1096 "e.y"
+//#line 1097 "e.y"
 { yyval = with(val_peek(3),val_peek(0)); }
 break;
 case 300:
-//#line 1098 "e.y"
+//#line 1099 "e.y"
 { reserved("on event"); }
 break;
 case 301:
-//#line 1099 "e.y"
+//#line 1100 "e.y"
 { reserved("on event"); }
 break;
 case 302:
-//#line 1106 "e.y"
+//#line 1107 "e.y"
 { yyval = mType(val_peek(1),list(),val_peek(0)); }
 break;
 case 303:
-//#line 1107 "e.y"
+//#line 1108 "e.y"
 { yyval = mType(val_peek(4),val_peek(2),val_peek(0)); }
 break;
 case 304:
-//#line 1108 "e.y"
+//#line 1109 "e.y"
 { yyval = mType("run",val_peek(2),val_peek(0)); }
 break;
 case 305:
-//#line 1112 "e.y"
+//#line 1113 "e.y"
 { yyval = val_peek(0); }
 break;
 case 306:
-//#line 1113 "e.y"
+//#line 1114 "e.y"
 { yyval = val_peek(1); }
 break;
 case 307:
-//#line 1117 "e.y"
+//#line 1118 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 308:
-//#line 1118 "e.y"
+//#line 1119 "e.y"
 { yyval = with(val_peek(3),val_peek(0)); }
 break;
 case 309:
-//#line 1125 "e.y"
+//#line 1126 "e.y"
 { yyval = pType(val_peek(1),val_peek(0)); }
 break;
 case 310:
-//#line 1126 "e.y"
+//#line 1127 "e.y"
 { yyval = pType(null,val_peek(0)); }
 break;
 case 311:
-//#line 1130 "e.y"
+//#line 1131 "e.y"
 { yyval = null; }
 break;
 case 312:
-//#line 1131 "e.y"
+//#line 1132 "e.y"
 { yyval = val_peek(0); }
 break;
 case 315:
-//#line 1147 "e.y"
+//#line 1148 "e.y"
 { begin(); }
 break;
 case 316:
-//#line 1154 "e.y"
+//#line 1155 "e.y"
 { end(); }
 break;
-//#line 6783 "EParser.java"
+//#line 6791 "EParser.java"
 //########## END OF USER-SUPPLIED ACTIONS ##########
     }//switch
     //#### Now let's reduce... ####



1.90      +15 -7     e/src/jsrc/org/erights/e/elang/syntax/e.y

Index: e.y
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/e.y,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -r1.89 -r1.90
--- e.y	2001/11/01 17:42:30	1.89
+++ e.y	2001/11/04 00:38:11	1.90
@@ -40,11 +40,12 @@
 import org.erights.e.elang.interp.Interp;
 import org.erights.e.elib.base.Ejector;
 import org.erights.e.elib.prim.StaticMaker;
+import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.tables.ConstMap;
 import org.erights.e.elib.tables.IdentityCacheTable;
 import org.erights.e.elib.tables.IntTable;
 import org.erights.e.elib.tables.Twine;
- import org.quasiliteral.astro.MilkToken;
+import org.quasiliteral.astro.AstroToken;
 %}
 
 /* Categorical terminals */
@@ -969,9 +970,9 @@
  * A non-reserved Identifier (as a String)
  */
 ident:
-        Identifier                      { $$ = ((MilkToken)$1).getText(); }
+        Identifier                      { $$ = ((AstroToken)$1).getText(); }
  |      reserved                        { reserved("keyword \"" +
-                                                   ((MilkToken)$1).getText() +
+                                                   ((AstroToken)$1).getText() +
                                                    "\""); }
  ;
 
@@ -1348,7 +1349,7 @@
  *
  */
 private int yylex() {
-    MilkToken token = null;
+    AstroToken token = null;
     try {
         token = myLexer.nextToken();
     } catch (IOException ex) {
@@ -1363,7 +1364,7 @@
  *
  */
 private void yyerror(String s) throws SyntaxException {
-    int ttype = ((MilkToken)yylval).getType();
+    int ttype = ((AstroToken)yylval).getType();
     if (EParser.EOFTOK == ttype && "syntax error".equals(s)) {
         myLexer.needMore("Unexpected EOF");
         
@@ -1398,10 +1399,10 @@
  *
  */
 private boolean isTokenKind(Object tok, int[] members) {
-    if (! (tok instanceof MilkToken)) {
+    if (! (tok instanceof AstroToken)) {
         return false;
     }
-    int ttype = ((MilkToken)tok).getType();
+    int ttype = ((AstroToken)tok).getType();
     for (int i = 0; i < members.length; i++) {
         if (ttype == members[i]) {
             return true;
@@ -1633,6 +1634,13 @@
     TheTokens[MatchBind]        = "=~";
     TheTokens[MisMatch]         = "!~";
     TheTokens[Audit]            = "::";
+}
+
+/**
+ *
+ */
+static /*package*/ ConstList getTokenNames() {
+    return ConstList.fromArray(TheTokens);
 }
 
 /**



1.14      +13 -0     e/src/jsrc/org/erights/e/elib/base/SourceSpan.java

Index: SourceSpan.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/base/SourceSpan.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- SourceSpan.java	2001/09/06 09:55:47	1.13
+++ SourceSpan.java	2001/11/04 00:38:11	1.14
@@ -192,6 +192,19 @@
     }
 
     /**
+     * Return a non-oneToOne form of this SourceSpan
+     */
+    public SourceSpan notOneToOne() {
+        if (myIsOneToOne) {
+            return new SourceSpan(myUrl, false,
+                                  myStartLine, myStartCol,
+                                  myEndLine, myEndCol);
+        } else {
+            return this;
+        }
+    }
+
+    /**
      *
      */
     public String toString() {



1.6       +7 -0      e/src/jsrc/org/erights/e/elib/tables/AtomicTwine.java

Index: AtomicTwine.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tables/AtomicTwine.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- AtomicTwine.java	2001/09/06 09:55:51	1.5
+++ AtomicTwine.java	2001/11/04 00:38:12	1.6
@@ -74,5 +74,12 @@
     /**
      *
      */
+    /*package*/ Twine infectOneToOne(String str) {
+        return Twine.fromString(str, optSourceSpan());
+    }
+
+    /**
+     *
+     */
     /*package*/ abstract ConstList mergedParts(AtomicTwine other);
 }



1.11      +16 -0     e/src/jsrc/org/erights/e/elib/tables/CompositeTwine.java

Index: CompositeTwine.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tables/CompositeTwine.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- CompositeTwine.java	2001/09/07 05:49:23	1.10
+++ CompositeTwine.java	2001/11/04 00:38:12	1.11
@@ -168,4 +168,20 @@
         }
         return optResult;
     }
+
+    /**
+     *
+     */
+    /*package*/ Twine infectOneToOne(String str) {
+        Twine result = Twine.fromString("");
+        int pos = 0;
+        for (int i = 0; i < myParts.size(); i++) {
+            Twine part = (Twine)myParts.get(i);
+            int len = part.size();
+            String segment = str.substring(pos, pos+len);
+            result = (Twine)result.add(part.infectOneToOne(segment));
+            pos += len;
+        }
+        return result;
+    }
 }



1.5       +7 -0      e/src/jsrc/org/erights/e/elib/tables/EmptyTwine.java

Index: EmptyTwine.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tables/EmptyTwine.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- EmptyTwine.java	2001/10/02 23:38:32	1.4
+++ EmptyTwine.java	2001/11/04 00:38:12	1.5
@@ -116,6 +116,13 @@
     /**
      *
      */
+    /*package*/ Twine infectOneToOne(String str) {
+        return Twine.fromString(str, null);
+    }
+
+    /**
+     *
+     */
     public void printOn(TextWriter out) throws IOException {
         //XXX is this the same as printing nothing?
         out.print("");



1.9       +2 -1      e/src/jsrc/org/erights/e/elib/tables/LocatedTwine.java

Index: LocatedTwine.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tables/LocatedTwine.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- LocatedTwine.java	2001/09/07 05:49:23	1.8
+++ LocatedTwine.java	2001/11/04 00:38:12	1.9
@@ -26,7 +26,8 @@
 import java.io.IOException;
 
 /**
- * A Twine containing only a String. <p>
+ * A Twine containing only a non-empty String and corresponding source-span
+ * info.
  *
  * @author <a href="mailto:markm@erights.org">Mark S. Miller</a>
  */



1.20      +37 -11    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.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- Twine.java	2001/09/06 09:55:51	1.19
+++ Twine.java	2001/11/04 00:38:12	1.20
@@ -236,12 +236,37 @@
     public abstract SourceSpan optSourceSpan();
 
     /**
-     * Returns a Twine with str as the string part, and the source info from
-     * this Twine.  The default implementation here drops all source info.
-     * XXX make abstract and implement overrides
+     *
      */
-    public Twine infect(String str) {
-        return Twine.fromString(str);
+    /*package*/ abstract Twine infectOneToOne(String str);
+
+    /**
+     * Returns a Twine with str as the string part, and the source info from
+     * this Twine.
+     * <p>
+     * @param str The string to annotate with source-span info from this
+     *            Twine.
+     * @param oneToOne If true, the two strings must be the same size, in
+     *                 which case the new string gets this Twine's
+     *                 optSourceSpan().  If false, then the new string will
+     *                 only get a non-oneToOne form of this source-span
+     */
+    public Twine infect(String str, boolean oneToOne) {
+        if (oneToOne) {
+            if (str.length() == size()) {
+                return infectOneToOne(str);
+            } else {
+                throw new RuntimeException(E.toQuote(str) + " and " +
+                                           quote() + " must be the " +
+                                           "same size");
+            }
+        } else {
+            SourceSpan optSpan = optSourceSpan();
+            if (null != optSpan) {
+                optSpan = optSpan.notOneToOne();
+            }
+            return Twine.fromString(str, optSpan);
+        }
     }
 
     /**
@@ -345,7 +370,7 @@
             if (null != newStr) {
                 result = (Twine)result.add(run(p1, p2));
                 Twine oldStr = (Twine)run(p2, p2+1);
-                result = (Twine)result.add(oldStr.infect(newStr));
+                result = (Twine)result.add(oldStr.infect(newStr, false));
                 p1 = p2+1;
             }
         }
@@ -494,7 +519,8 @@
         for (int p2 = indexOf(oldStr); p2 != -1; p2 = indexOf(oldStr,p1)) {
             Twine left = (Twine)run(p1, p2);
             Twine oldTwine = (Twine)run(p2, p2 + oldLen);
-            result = (Twine)result.add(left).add(oldTwine.infect(newStr));
+            result = (Twine)result.add(left)
+              .add(oldTwine.infect(newStr, false));
             p1 = p2 + oldLen;
         }
         result = (Twine)result.add(run(p1, size()));
@@ -556,15 +582,15 @@
     /**
      *
      */
-    public String toLowerCase() {
-        return bare().toLowerCase();
+    public Twine toLowerCase() {
+        return infect(bare().toLowerCase(), true);
     }
 
     /**
      *
      */
-    public String toUpperCase() {
-        return bare().toUpperCase();
+    public Twine toUpperCase() {
+        return infect(bare().toUpperCase(), true);
     }
 
     /**



1.2       +12 -9     e/src/jsrc/org/quasiliteral/astro/AstroToken.java

Index: AstroToken.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/astro/AstroToken.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AstroToken.java	2001/11/03 13:32:51	1.1
+++ AstroToken.java	2001/11/04 00:38:12	1.2
@@ -6,8 +6,9 @@
 import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.base.SourceSpan;
 import org.quasiliteral.term.Functor;
-import org.quasiliteral.term.Literal;
 
+import java.math.BigInteger;
+
 /**
  * A Kind of Antlr {@link Token} that preserves all the information in a
  * {@link Functor}, except that it uses an int rather that a string for the
@@ -24,8 +25,8 @@
     private Twine mySource;
 
     /**
-     * If present, then this should be a literal character, string, twine
-     * integer, or float64 whose value can be recovered from mySource
+     * If present, this must be a {@link Character},
+     * {@link BigInteger}, {@link Double}, {@link String}, or {@link Twine}.
      */
     private Object myOptValue;
 
@@ -54,7 +55,13 @@
     }
 
     /**
-     *
+     * @param ttype Identifies a token type in a particular grammar or set
+     *              of related grammars.
+     * @param source The source text this token was extracted from.
+     * @param optValue An optional {@link Character},
+     *                 {@link BigInteger}, {@link Double},
+     *                 {@link String}, or {@link Twine} calculated from
+     *                 lexing this token
      */
     public AstroToken(int ttype, Twine source, Object optValue) {
         super(ttype, source.bare());
@@ -67,11 +74,7 @@
      */
     public Functor asFunctor(ConstList typeNames) {
         String tokenType = (String)typeNames.get(getType());
-        if (null == myOptValue) {
-            return new Functor(tokenType, mySource);
-        } else {
-            return new Literal(tokenType, mySource, myOptValue);
-        }
+        return new Functor(tokenType, mySource, myOptValue);
     }
 
     /**



1.1                  e/src/jsrc/org/quasiliteral/quasiterm/term.y

Index: term.y
===================================================================

/**
 * XXX To be replaced by a term.g to be processed by Antlr
 */

%{
package org.quasiliteral.quasiterm;

import org.erights.e.elang.syntax.SyntaxException;
import org.erights.e.elib.tables.ConstList;
%}

%token Identifier       //Like E: [0-9a-zA-Z_][a-zA-Z_]*

%token LiteralChar      //like Java & E: unicode
%token LiteralInteger   //like Java & E: precision unlimited
%token LiteralFloat64   //like Java & E: IEEE double precision
%token LiteralString    //like Java & E: double quoted
%token LiteralTwine     //like E: quasi-quoted without holes

%%

term:
        functor                         { $$ = b.term($1, b.list()); }
 |      functor '(' argList ')'         { $$ = b.term($1, $3); }
 |      '[' argList ']'                 { $$ = b.term("list", $2); }
 ;

argList:
        /* empty */                     { $$ = b.list(); }
 |      args
 ;

args:
        term                            { $$ = b.list($1); }
 |      hole repr                       { $$ = b.repr($1, $2); }
 |      args ',' term                   { $$ = b.with($1, $3); }
 ;

functor:
        Identifier                      { $$ = b.functor($1, $1, null); }
 |      Identifier ':' LiteralString    { $$ = b.functor($1, $3, null); }
 |      Identifier '=' literal          { $$ = b.functor($1, $1, $3); }
 |      Identifier ':' LiteralString '=' literal
                                        { $$ = b.functor($1, $2, $3); }
 |      literal
 |      hole
 ;

hole:
        '$' '{' LiteralInteger '}'      { $$ = b.dollarHole($3); }
 |      '@' '{' LiteralInteger '}'      { $$ = b.atHole($3); }
 ;

repr:
        '?'
 |      '+'
 |      '*'
 ;

literal:
        LiteralChar
 |      LiteralInteger
 |      LiteralFloat64
 |      LiteralString
 |      LiteralTwine
 ;

%%


/**
 *
 */
private TermBuilder b;

/**
 *
 */
private int yylex() {
    throw new RuntimeException("XXX not yet implemented");
}

/**
 *
 */
private void yyerror(String s) throws SyntaxException {
    throw new RuntimeException("XXX not yet implemented");
}

/**
 *
 */
static /*package*/ boolean isContinuer(int ttype) {
    return false; //for now
}


/*********************************/

/**
 *
 */
static private String[] TheTokens = new String[yyname.length];

/** Not provided for us */
static /*package*/ final short EOFTOK = 0;

static {
    System.arraycopy(yyname, 0, TheTokens, 0, yyname.length);

    /* Since this language has no keywords, it's not a conflict
     * for the names to be identifiers
     */

    TheTokens[EOFTOK]           = "EndOfFile";
}

/**
 *
 */
static /*package*/ ConstList getTokenNames() {
    return ConstList.fromArray(TheTokens);
}



1.2       +59 -16    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.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Functor.java	2001/11/03 13:32:51	1.1
+++ Functor.java	2001/11/04 00:38:12	1.2
@@ -10,11 +10,14 @@
 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.develop.format.StringHelper;
 import org.quasiliteral.astro.AstroToken;
 import antlr.Token;
 import antlr.Grammar;
 import antlr.CommonToken;
 
+import java.math.BigInteger;
+
 /**
  * Like an Antlr {@link Token}, but with differences that make it suitable
  * for quasiliteral processing.
@@ -55,6 +58,13 @@
     private final Twine mySource;
 
     /**
+     * @serial an optional {@link Character},
+     * {@link BigInteger}, {@link Double},
+     * {@link String}, or {@link Twine} calculated from lexing the token
+     */
+    private Object myOptValue;
+
+    /**
      * @param tokenType The name of an Antlr token type int in a particular
      *                  grammar.
      * @param source The source text corresponding to the original source of
@@ -63,12 +73,26 @@
      *               information says what positions in the original source
      *               it corresponds to. The source position info is not part
      *               of the normal printed form.
-     * @param optValue An optional value calculated from the source text.
-     *                 Not part of the normal printed form.
+     * @param optValue An optional {@link Character},
+     *                 {@link BigInteger}, {@link Double},
+     *                 {@link String}, or {@link Twine} calculated from the
+     *                 source text.
      */
-    public Functor(String tokenType, Twine source) {
+    public Functor(String tokenType, Twine source, Object optValue) {
         myTokenType = tokenType;
         mySource = source;
+        if (null == optValue ||
+            optValue instanceof Character ||
+            optValue instanceof BigInteger ||
+            optValue instanceof Double ||
+            optValue instanceof String ||
+            optValue instanceof Twine)
+        {
+            myOptValue = optValue;
+        } else {
+            throw new RuntimeException(optValue.getClass().getName() +
+                                       " not a literal type");
+        }
     }
 
     /**
@@ -89,7 +113,8 @@
                                              token.getLine(),
                                              token.getColumn());
             return new Functor(tokenType,
-                               Twine.fromString(token.getText(), span));
+                               Twine.fromString(token.getText(), span),
+                               null);
         }
     }
 
@@ -98,16 +123,16 @@
      */
     public AstroToken asToken(ConstMap typeNums) {
         int tokenTypeInt = E.asInt(typeNums.get(myTokenType));
-        return new AstroToken(tokenTypeInt, mySource);
+        return new AstroToken(tokenTypeInt, mySource, myOptValue);
     }
 
     /**
-     * 'FunctorMaker new(myTokenType, mySource)'
+     * 'FunctorMaker new(myTokenType, mySource, myOptValue)'
      */
     public Object[] getCanonicalState() {
         Object[] result = {
             FunctorMaker, "new",
-            myTokenType, mySource
+            myTokenType, mySource, myOptValue
         };
         return result;
     }
@@ -129,6 +154,13 @@
     /**
      *
      */
+    public Object getValue() {
+        return myOptValue;
+    }
+
+    /**
+     * quasiFlag defaults to false
+     */
     public String toString() {
         return toString(false);
     }
@@ -137,16 +169,27 @@
      *
      */
     public String toString(boolean quasiFlag) {
+        //XXX If the token type and source are implied by the printed
+        //form of the value, then only the value should be printed.
         String result = myTokenType;
-        if (! myTokenType.equals(mySource.bare())) {
-            result += ":";
-            Twine quoted = mySource.quote();
-            if (quasiFlag) {
-                quoted = quoted.replaceAll("$", "$$");
-                quoted = quoted.replaceAll("@", "@@");
-                quoted = quoted.replaceAll("`", "``");
-            }
-            result += quoted.bare();
+        String bareSource = mySource.bare();
+        if (! myTokenType.equals(bareSource)) {
+            result += ":" + StringHelper.quote(bareSource);
+        }
+        if (null != myOptValue) {
+            //XXX If the value is a String or a Twine, then
+            //       if the token type is LiteralTwine, then
+            //          the token should be printed as a literal twine
+            //       else
+            //          the token should be printed as a literal string
+            //    else
+            //       the token should be printed according to its type
+            result += "=" + E.toQuote(myOptValue).bare();
+        }
+        if (quasiFlag) {
+            result = StringHelper.replaceAll(result, "$", "$$");
+            result = StringHelper.replaceAll(result, "@", "@@");
+            result = StringHelper.replaceAll(result, "`", "``");
         }
         return result;
     }