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

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Thu, 1 Nov 2001 01:32:25 -0500


markm       01/11/01 01:32:25

  Modified:    src/bin/resources/org/erights/e/elang/syntax
                        ParserTables.data
               src/jsrc/org/erights/e/elang/syntax EBuilder.java
                        ELexer.java EParser.java HilbertHotel.java
                        Indenter.java Token.java URI.java e.y
               src/jsrc/org/quasiliteral/astro Functor.java
  Log:
  Towards antlr & quasis: Better lexing, token handling

Revision  Changes    Path
1.24      +14 -28    e/src/bin/resources/org/erights/e/elang/syntax/ParserTables.data

Index: ParserTables.data
===================================================================
RCS file: /cvs/e/src/bin/resources/org/erights/e/elang/syntax/ParserTables.data,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
Binary files /tmp/cvsREUfZO and /tmp/cvs0Zaa9s differ



1.78      +67 -35    e/src/jsrc/org/erights/e/elang/syntax/EBuilder.java

Index: EBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/EBuilder.java,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -r1.77 -r1.78
--- EBuilder.java	2001/10/27 17:27:42	1.77
+++ EBuilder.java	2001/11/01 06:32:24	1.78
@@ -233,7 +233,7 @@
 
         String verbName;
         if (verb instanceof Token) {
-            verbName = ((Token)verb).token();
+            verbName = ((Token)verb).getText();
         } else {
             verbName = (String)verb;
         }
@@ -305,6 +305,13 @@
     /**
      *
      */
+    /*package*/ EExpr not(Object x) {
+        return call(x, "not", list());
+    }
+
+    /**
+     *
+     */
     /*package*/ EExpr call(Object recipientExpr,
                            Object verb,
                            Object args) {
@@ -317,7 +324,7 @@
      *
      */
     /*package*/ EExpr doMeta(Object keyword, Object verb, Object args) {
-        String kword = ((Token)keyword).token().intern();
+        String kword = ((Token)keyword).getText().intern();
         String vrb = ((String)verb).intern();
         EExpr[] exprs = exprs(args);
         if ("meta" == kword) {
@@ -386,7 +393,7 @@
      *
      */
     /*package*/ EExpr doMetaSend(Object keyword, Object verb, Object args) {
-        String kword = ((Token)keyword).token().intern();
+        String kword = ((Token)keyword).getText().intern();
         String vrb = ((String)verb).intern();
         EExpr[] exprs = exprs(args);
         if ("meta" == kword) {
@@ -590,10 +597,28 @@
     }
 
     /**
+     * When an at-hole is '@<ident>' or '@_'
+     */
+    /*package*/ Pattern atNoun(Object token) {
+        String str = ((Token)token).getText();
+        if (str.charAt(0) != '@') {
+            throw new RuntimeException("internal: \"" + str +
+                                       "\" needs initial @");
+        }
+        str = str.substring(1);
+        str = hilbert(str);
+        if ("_".equals(str)) {
+            return ignore();
+        } else {
+            return finalPattern(str);
+        }
+    }
+
+    /**
      *
      */
-    /*package*/ Pattern finalPattern(Object name) {
-        return finalPattern(name, ANY);
+    /*package*/ Pattern finalPattern(Object str) {
+        return finalPattern((String)str, ANY);
     }
 
     /**
@@ -629,8 +654,45 @@
     }
 
     /**
+     * When a dollar-hole is '$<ident>'
+     */
+    /*package*/ EExpr dollarNoun(Object token) {
+        String str = ((Token)token).getText();
+        if (str.charAt(0) != '$') {
+            throw new RuntimeException("internal: \"" + str +
+                                       "\" needs initial $");
+        }
+        str = str.substring(1);
+        str = hilbert(str);
+        return noun(str);
+    }
+
+    /**
+     * generate 'unique' temporary variable names for transformations.
+     * Suffix must be odd to make room for the new guests at the Hilbert
+     * Hotel.  See hilbert().
+     */
+    /*package*/ String newTemp(String baseName) {
+        return myHilbert.newTemp(baseName);
+    }
+
+    /**
+     * Make vacancies for new temporary variable names
+     */
+    /*package*/ String hilbert(Object name) {
+        return myHilbert.rename((String)name);
+    }
+
+    /**
      *
      */
+    static /*package*/ NounExpr noun(Object name) {
+        return new NounExpr((String)name);
+    }
+
+    /**
+     *
+     */
     static /*package*/ SlotExpr slotExpr(Object name) {
         return new SlotExpr(noun((String)name));
     }
@@ -1004,36 +1066,6 @@
             nameExprs[i] = slotExpr(names[i]);
         }
         return tuple(nameExprs);
-    }
-
-    /**
-     * generate 'unique' temporary variable names for transformations.
-     * Suffix must be odd to make room for the new guests at the Hilbert
-     * Hotel.  See hilbert().
-     */
-    /*package*/ String newTemp(String baseName) {
-        return myHilbert.newTemp(baseName);
-    }
-
-    /**
-     *
-     */
-    /*package*/ String hilbert(Object ident) {
-        return myHilbert.rename(((Identifier)ident).token());
-    }
-
-    /**
-     *
-     */
-    /*package*/ EExpr not(Object x) {
-        return call(x, "not", list());
-    }
-
-    /**
-     *
-     */
-    static /*package*/ NounExpr noun(Object name) {
-        return new NounExpr((String)name);
     }
 
     /**



1.56      +83 -38    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.55
retrieving revision 1.56
diff -u -r1.55 -r1.56
--- ELexer.java	2001/10/03 04:41:02	1.55
+++ ELexer.java	2001/11/01 06:32:24	1.56
@@ -82,11 +82,6 @@
     private boolean myDelayedNextChar = false;
 
     /**
-     * Should we return to eating literal quasi-string characters?
-     */
-    private boolean myQuasiAgainFlag = false;
-
-    /**
      *
      */
     private boolean myPartialFlag;
@@ -163,7 +158,6 @@
         myOptStartPos = -1;
         myOptStartText = null;
         myDelayedNextChar = true; //rather than doing nextChar() ourselves
-        myQuasiAgainFlag = false;
         myIndenter = new Indenter();
         myContinueFlag = false;
     }
@@ -180,7 +174,6 @@
         myOptStartPos = -1;
         myOptStartText = null;
         myDelayedNextChar = true;
-        myQuasiAgainFlag = false;
         myIndenter = new Indenter();
         myContinueFlag = false;
     }
@@ -398,8 +391,7 @@
             myDelayedNextChar = false;
         }
 
-        if (myQuasiAgainFlag) {
-            myQuasiAgainFlag = false;
+        if ('`' == myIndenter.getCloser()) {
             //start token without skipping whitespace
             startToken();
             return quasiPart();
@@ -408,7 +400,14 @@
         startToken();
 
         switch(myChar) {
-            case EOFCHAR: {
+            case ';':
+            case ',':
+            case '~':
+            case '?': {
+                char c = (char)myChar;
+                nextChar();
+                return new Token(endToken(), c);
+            } case EOFCHAR: {
                 return new Token(Twine.fromString(""), EParser.EOFTOK);
             } case '\n': {
                 myDelayedNextChar = true;
@@ -425,16 +424,63 @@
                 return openBracket(']');
             } case ']': {
                 return closeBracket();
-            }
-            case ';':
-            case ',':
-            case '~':
-            case '?':
-            case '$':
-            case '@': {
-                char c = (char)myChar;
+            } case '$': {
                 nextChar();
-                return new Token(endToken(), c);
+                if (myChar == '{') {
+                    //A '${' both closes a '$' and opens a '}'
+                    nextChar();
+                    Twine openner = endToken();
+                    myIndenter.pop('$', openner);
+                    return openBracket(EParser.DollarOpen, openner, '}');
+                } else if (myChar != EOFCHAR &&
+                           isIdentifierStart((char)myChar)) {
+                    //A '$<ident>' closes a '$'
+                    do {
+                        nextChar();
+                    } while (myChar != EOFCHAR &&
+                             isIdentifierPart((char)myChar));
+                    Twine name = endToken();
+                    String key = name.toLowerCase().substring(1);
+                    int tt = EParser.tokenType(key);
+                    if (tt != -1) {
+                        syntaxError(key + " is a keyword");
+                    }
+                    myIndenter.pop('$', name);
+                    return new Token(name, EParser.DollarIdent);
+                }
+                return new Token(endToken(), '$');
+            } case '@': {
+                nextChar();
+                if (myChar == '{') {
+                    //A '@{' both closes a '@' and opens a '}'
+                    nextChar();
+                    Twine openner = endToken();
+                    myIndenter.pop('@', openner);
+                    return openBracket(EParser.AtOpen, openner, '}');
+                } else if (myChar == '_' &&
+                           ! isIdentifierPart(peekChar())) {
+                    //A '@_' closes a '@'
+                    nextChar();
+                    Twine name = endToken();
+                    myIndenter.pop('@', name);
+                    return new Token(name, EParser.AtIdent);
+                } else if (myChar != EOFCHAR &&
+                           isIdentifierStart((char)myChar)) {
+                    //A '@<ident>' closes a '@'
+                    do {
+                        nextChar();
+                    } while (myChar != EOFCHAR &&
+                             isIdentifierPart((char)myChar));
+                    Twine name = endToken();
+                    String key = name.toLowerCase().substring(1);
+                    int tt = EParser.tokenType(key);
+                    if (tt != -1) {
+                        syntaxError(key + " is a keyword");
+                    }
+                    myIndenter.pop('@', name);
+                    return new Token(name, EParser.AtIdent);
+                }
+                return new Token(endToken(), '@');
             } case '.': {
                 nextChar();
                 if (myChar == '.') {
@@ -672,8 +718,8 @@
                 return stringLiteral();
             } case '`': {
                 //eat the backquote here so quasiPart can also
-                //be called when we're quasiAgain'ing (in which case
-                //there is no leading backquote).
+                //be called when we're continuing after a hole, in which case
+                //there is no leading backquote.
                 nextChar();
                 Twine openner = (Twine)myLTwine.run(myOptStartPos, myPos);
                 myIndenter.push(openner, '`', 0);
@@ -722,16 +768,24 @@
      *
      */
     private Token openBracket(char closer) throws IOException {
-        char opennerChar = (char)myChar;
+        int tokenType = myChar;
         nextChar();
         Twine openner = endToken();
+        return openBracket(tokenType, openner, closer);
+    }
+
+    /**
+     *
+     */
+    private Token openBracket(int tokenType, Twine openner, char closer)
+    throws IOException {
         if (isWhite(myPos, myLData.length)) {
             myIndenter.nest(openner, closer);
         } else {
             //Indent the next line to right after the open.
             myIndenter.push(openner, closer, myPos);
         }
-        return new Token(openner, opennerChar);
+        return new Token(openner, tokenType);
     }
 
     /**
@@ -965,20 +1019,6 @@
     }
 
     /**
-     * Has an expression or pattern inside a curly-bracketted hole inside a
-     * quasiliteral just ended?
-     * <p>
-     * If so, we should go back to treating text as part of the quasiliteral
-     * string.  Currently, this method is the means for the
-     * evil parser-to-lexer feedback which yacc supports, but isn't supported
-     * in general.  Instead, this method should go away, and we should ask
-     * myIndenter.
-     */
-    /*package*/ void quasiAgain() {
-        myQuasiAgainFlag = true;
-    }
-
-    /**
      *
      */
     private Token quasiPart() throws IOException, SyntaxException {
@@ -1032,9 +1072,11 @@
                 nextChar();
 
             } else {
+                Twine openner = endToken();
+                myIndenter.nest(openner, (char)myChar);
                 //interpolated '$' or '@' is neither eaten nor added to the
                 //value of the resulting QuasiOpen token.
-                return new QuasiPart(endToken(),
+                return new QuasiPart(openner,
                                      EParser.QuasiOpen,
                                      buf.toString());
             }
@@ -1190,6 +1232,9 @@
                 do {
                     t = lex.nextToken();
                     stdout.println(t);
+                    if (t.tokenType() == '\n') {
+                        stdout.println(lex.myIndenter.toString());
+                    }
                 } while (t.tokenType() != EParser.EOFTOK);
                 return;
             } catch (SyntaxException sex) {



1.93      +817 -811  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.92
retrieving revision 1.93
diff -u -r1.92 -r1.93
--- EParser.java	2001/10/27 17:27:42	1.92
+++ EParser.java	2001/11/01 06:32:24	1.93
@@ -167,157 +167,161 @@
 public final static short VerbAss=263;
 public final static short QuasiOpen=264;
 public final static short QuasiClose=265;
-public final static short URI=266;
-public final static short URIStart=267;
-public final static short BodyStartWord=268;
-public final static short BodyNextWord=269;
-public final static short VTableStartWord=270;
-public final static short VTableNextWord=271;
-public final static short BIND=272;
-public final static short CATCH=273;
-public final static short CLASS=274;
-public final static short DEF=275;
-public final static short DELEGATE=276;
-public final static short ELSE=277;
-public final static short ESCAPE=278;
-public final static short FINALLY=279;
-public final static short FOR=280;
-public final static short IF=281;
-public final static short IN=282;
-public final static short MATCH=283;
-public final static short META=284;
-public final static short PRAGMA=285;
-public final static short SWITCH=286;
-public final static short THUNK=287;
-public final static short TO=288;
-public final static short TRY=289;
-public final static short VAR=290;
-public final static short WHEN=291;
-public final static short WHILE=292;
-public final static short DEFINE=293;
-public final static short ON=294;
-public final static short SELECT=295;
-public final static short TYPEDEF=296;
-public final static short ABSTRACT=297;
-public final static short AN=298;
-public final static short AS=299;
-public final static short ATTRIBUTE=300;
-public final static short BE=301;
-public final static short BEGIN=302;
-public final static short BEHALF=303;
-public final static short BELIEF=304;
-public final static short BELIEVE=305;
-public final static short BELIEVES=306;
-public final static short CASE=307;
-public final static short CONST=308;
-public final static short CONSTRUCTOR=309;
-public final static short CONTEXT=310;
-public final static short DECLARE=311;
-public final static short DEFAULT=312;
-public final static short DEFMACRO=313;
-public final static short DEPRECATED=314;
-public final static short DISPATCH=315;
-public final static short DO=316;
-public final static short ENCAPSULATE=317;
-public final static short ENCAPSULATED=318;
-public final static short ENCAPSULATES=319;
-public final static short END=320;
-public final static short ENSURE=321;
-public final static short ENUM=322;
-public final static short EVENTUAL=323;
-public final static short EVENTUALLY=324;
-public final static short EXPORT=325;
-public final static short EXTENDS=326;
-public final static short FACET=327;
-public final static short FORALL=328;
-public final static short FUNCTION=329;
-public final static short GIVEN=330;
-public final static short HIDDEN=331;
-public final static short HIDES=332;
-public final static short IMPLEMENTS=333;
-public final static short INTERFACE=334;
-public final static short IS=335;
-public final static short KNOW=336;
-public final static short KNOWS=337;
-public final static short LAMBDA=338;
-public final static short LET=339;
-public final static short METHOD=340;
-public final static short METHODS=341;
-public final static short MODULE=342;
-public final static short NAMESPACE=343;
-public final static short NATIVE=344;
-public final static short OBEYS=345;
-public final static short OCTET=346;
-public final static short ONEWAY=347;
-public final static short PACKAGE=348;
-public final static short PRIVATE=349;
-public final static short PROTECTED=350;
-public final static short PUBLIC=351;
-public final static short RAISES=352;
-public final static short RELIANCE=353;
-public final static short RELIANT=354;
-public final static short RELIES=355;
-public final static short RELY=356;
-public final static short REVEAL=357;
-public final static short SAKE=358;
-public final static short SIGNED=359;
-public final static short STATIC=360;
-public final static short STRUCT=361;
-public final static short SUCHTHAT=362;
-public final static short SUPPORTS=363;
-public final static short SUSPECT=364;
-public final static short SUSPECTS=365;
-public final static short SYNCHRONIZED=366;
-public final static short THIS=367;
-public final static short THROWS=368;
-public final static short TRANSIENT=369;
-public final static short TRUNCATABLE=370;
-public final static short UNSIGNED=371;
-public final static short UNUM=372;
-public final static short USES=373;
-public final static short USING=374;
-public final static short UTF8=375;
-public final static short UTF16=376;
-public final static short VALUETYPE=377;
-public final static short VIRTUAL=378;
-public final static short VOLATILE=379;
-public final static short WSTRING=380;
-public final static short EOL=381;
-public final static short OpLAnd=382;
-public final static short OpLOr=383;
-public final static short OpSame=384;
-public final static short OpNSame=385;
-public final static short OpButNot=386;
-public final static short OpLeq=387;
-public final static short OpABA=388;
-public final static short OpGeq=389;
-public final static short OpThru=390;
-public final static short OpTill=391;
-public final static short OpAsl=392;
-public final static short OpAsr=393;
-public final static short OpFlrDiv=394;
-public final static short OpMod=395;
-public final static short OpPow=396;
-public final static short OpAss=397;
-public final static short OpAssAdd=398;
-public final static short OpAssAnd=399;
-public final static short OpAssAprxDiv=400;
-public final static short OpAssFlrDiv=401;
-public final static short OpAssAsl=402;
-public final static short OpAssAsr=403;
-public final static short OpAssRemdr=404;
-public final static short OpAssMod=405;
-public final static short OpAssMul=406;
-public final static short OpAssOr=407;
-public final static short OpAssPow=408;
-public final static short OpAssSub=409;
-public final static short OpAssXor=410;
-public final static short Send=411;
-public final static short OpWhen=412;
-public final static short MapsTo=413;
-public final static short MatchBind=414;
-public final static short MisMatch=415;
-public final static short Audit=416;
+public final static short DollarIdent=266;
+public final static short AtIdent=267;
+public final static short DollarOpen=268;
+public final static short AtOpen=269;
+public final static short URI=270;
+public final static short URIStart=271;
+public final static short BodyStartWord=272;
+public final static short BodyNextWord=273;
+public final static short VTableStartWord=274;
+public final static short VTableNextWord=275;
+public final static short BIND=276;
+public final static short CATCH=277;
+public final static short CLASS=278;
+public final static short DEF=279;
+public final static short DELEGATE=280;
+public final static short ELSE=281;
+public final static short ESCAPE=282;
+public final static short FINALLY=283;
+public final static short FOR=284;
+public final static short IF=285;
+public final static short IN=286;
+public final static short MATCH=287;
+public final static short META=288;
+public final static short PRAGMA=289;
+public final static short SWITCH=290;
+public final static short THUNK=291;
+public final static short TO=292;
+public final static short TRY=293;
+public final static short VAR=294;
+public final static short WHEN=295;
+public final static short WHILE=296;
+public final static short DEFINE=297;
+public final static short ON=298;
+public final static short SELECT=299;
+public final static short TYPEDEF=300;
+public final static short ABSTRACT=301;
+public final static short AN=302;
+public final static short AS=303;
+public final static short ATTRIBUTE=304;
+public final static short BE=305;
+public final static short BEGIN=306;
+public final static short BEHALF=307;
+public final static short BELIEF=308;
+public final static short BELIEVE=309;
+public final static short BELIEVES=310;
+public final static short CASE=311;
+public final static short CONST=312;
+public final static short CONSTRUCTOR=313;
+public final static short CONTEXT=314;
+public final static short DECLARE=315;
+public final static short DEFAULT=316;
+public final static short DEFMACRO=317;
+public final static short DEPRECATED=318;
+public final static short DISPATCH=319;
+public final static short DO=320;
+public final static short ENCAPSULATE=321;
+public final static short ENCAPSULATED=322;
+public final static short ENCAPSULATES=323;
+public final static short END=324;
+public final static short ENSURE=325;
+public final static short ENUM=326;
+public final static short EVENTUAL=327;
+public final static short EVENTUALLY=328;
+public final static short EXPORT=329;
+public final static short EXTENDS=330;
+public final static short FACET=331;
+public final static short FORALL=332;
+public final static short FUNCTION=333;
+public final static short GIVEN=334;
+public final static short HIDDEN=335;
+public final static short HIDES=336;
+public final static short IMPLEMENTS=337;
+public final static short INTERFACE=338;
+public final static short IS=339;
+public final static short KNOW=340;
+public final static short KNOWS=341;
+public final static short LAMBDA=342;
+public final static short LET=343;
+public final static short METHOD=344;
+public final static short METHODS=345;
+public final static short MODULE=346;
+public final static short NAMESPACE=347;
+public final static short NATIVE=348;
+public final static short OBEYS=349;
+public final static short OCTET=350;
+public final static short ONEWAY=351;
+public final static short PACKAGE=352;
+public final static short PRIVATE=353;
+public final static short PROTECTED=354;
+public final static short PUBLIC=355;
+public final static short RAISES=356;
+public final static short RELIANCE=357;
+public final static short RELIANT=358;
+public final static short RELIES=359;
+public final static short RELY=360;
+public final static short REVEAL=361;
+public final static short SAKE=362;
+public final static short SIGNED=363;
+public final static short STATIC=364;
+public final static short STRUCT=365;
+public final static short SUCHTHAT=366;
+public final static short SUPPORTS=367;
+public final static short SUSPECT=368;
+public final static short SUSPECTS=369;
+public final static short SYNCHRONIZED=370;
+public final static short THIS=371;
+public final static short THROWS=372;
+public final static short TRANSIENT=373;
+public final static short TRUNCATABLE=374;
+public final static short UNSIGNED=375;
+public final static short UNUM=376;
+public final static short USES=377;
+public final static short USING=378;
+public final static short UTF8=379;
+public final static short UTF16=380;
+public final static short VALUETYPE=381;
+public final static short VIRTUAL=382;
+public final static short VOLATILE=383;
+public final static short WSTRING=384;
+public final static short EOL=385;
+public final static short OpLAnd=386;
+public final static short OpLOr=387;
+public final static short OpSame=388;
+public final static short OpNSame=389;
+public final static short OpButNot=390;
+public final static short OpLeq=391;
+public final static short OpABA=392;
+public final static short OpGeq=393;
+public final static short OpThru=394;
+public final static short OpTill=395;
+public final static short OpAsl=396;
+public final static short OpAsr=397;
+public final static short OpFlrDiv=398;
+public final static short OpMod=399;
+public final static short OpPow=400;
+public final static short OpAss=401;
+public final static short OpAssAdd=402;
+public final static short OpAssAnd=403;
+public final static short OpAssAprxDiv=404;
+public final static short OpAssFlrDiv=405;
+public final static short OpAssAsl=406;
+public final static short OpAssAsr=407;
+public final static short OpAssRemdr=408;
+public final static short OpAssMod=409;
+public final static short OpAssMul=410;
+public final static short OpAssOr=411;
+public final static short OpAssPow=412;
+public final static short OpAssSub=413;
+public final static short OpAssXor=414;
+public final static short Send=415;
+public final static short OpWhen=416;
+public final static short MapsTo=417;
+public final static short MatchBind=418;
+public final static short MisMatch=419;
+public final static short Audit=420;
 public final static short YYERRCODE=256;
 final static short yylhs[] = {                           -1,
     0,    0,    0,    4,    4,    2,    6,    5,    5,    7,
@@ -332,26 +336,26 @@
    38,   38,   38,   37,   37,   37,   36,   36,   36,   36,
    36,   36,   36,   36,   36,   36,   36,   36,   36,   36,
    36,   36,   36,   36,   36,   36,   36,   36,   36,   36,
-   36,   36,   36,   36,   36,   58,   58,   58,   58,   58,
-   58,   42,   45,   55,   55,   55,   53,   54,   56,   56,
-   68,   67,   67,   66,   66,   66,   43,   43,   43,   44,
-   44,   69,   69,   70,   70,   71,   72,   72,   74,   74,
-   75,   76,   76,   63,   63,   77,   77,    3,    3,    3,
-   79,   79,   79,   79,   79,   80,   80,   81,   81,   82,
-   82,   83,   83,   84,   84,   85,   85,   85,   78,   78,
-   78,   78,   78,   78,   78,   78,   19,   19,   20,   20,
-   86,   86,   86,   86,   86,   86,   86,   88,   88,   88,
-   89,   89,   59,   59,   90,   90,   15,   15,   87,   87,
-   92,   92,   92,   92,   92,   93,   93,   93,   61,   61,
-   61,   62,   95,   96,   94,   94,   97,   64,   64,   98,
-   98,   99,    1,    1,    9,    9,  100,   73,   18,   18,
-   39,   39,   91,   91,   46,   46,  101,  101,   40,   13,
-   13,   17,   17,   17,   17,   17,   17,   17,   17,   17,
-   17,   17,   17,   48,   48,   49,   60,   60,   60,  104,
-  104,  105,  105,  103,  103,   51,   51,   65,  106,   52,
-   52,   57,   57,  107,  107,  107,  107,  109,  109,  109,
+   36,   36,   36,   36,   36,   59,   59,   59,   59,   59,
+   59,   43,   46,   56,   56,   56,   54,   55,   57,   57,
+   69,   68,   68,   67,   67,   67,   44,   44,   44,   45,
+   45,   70,   70,   71,   71,   72,   72,   74,   74,   75,
+   76,   76,   64,   64,   77,   77,    3,    3,    3,   79,
+   79,   79,   79,   79,   80,   80,   81,   81,   82,   82,
+   83,   83,   84,   84,   85,   85,   78,   78,   78,   78,
+   78,   78,   78,   78,   78,   19,   19,   20,   20,   86,
+   86,   86,   86,   86,   86,   86,   88,   88,   88,   89,
+   89,   60,   60,   90,   90,   15,   15,   87,   87,   92,
+   92,   92,   92,   92,   93,   93,   93,   62,   62,   62,
+   63,   95,   96,   94,   94,   97,   65,   65,   98,   98,
+   99,    1,    1,    9,    9,  100,   73,   18,   18,   39,
+   39,   91,   91,   47,   47,  101,  101,   40,   13,   41,
+   41,   17,   17,   17,   17,   17,   17,   17,   17,   17,
+   17,   17,   17,   49,   49,   50,   61,   61,   61,  104,
+  104,  105,  105,  103,  103,   52,   52,   66,  106,   53,
+   53,   58,   58,  107,  107,  107,  107,  109,  109,  109,
   109,  108,  108,  108,  111,  111,  112,  112,  113,  113,
-  110,  110,   41,   41,   47,   50,  102,  102,  102,  102,
+  110,  110,   42,   42,   48,   51,  102,  102,  102,  102,
   102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
   102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
   102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
@@ -373,21 +377,21 @@
     4,    4,    3,    3,    2,    3,    4,    2,    3,    3,
     4,    2,    3,    1,    2,    3,    1,    1,    1,    1,
     1,    1,    1,    3,    2,    1,    3,    3,    2,    4,
-    4,    5,    5,    1,    1,    1,    1,    4,    2,    2,
-    4,    2,    3,    2,    1,    2,    4,    3,    3,    4,
+    4,    5,    5,    1,    1,    1,    1,    3,    2,    2,
+    3,    2,    3,    2,    1,    2,    4,    3,    3,    4,
     3,    1,    3,    4,    6,    7,    8,    5,    5,    6,
     0,    6,    6,    0,    1,    1,    0,    1,    3,    1,
-    2,    2,    3,    3,    5,    0,    1,    2,    1,    4,
-    2,    1,    4,    1,    1,    3,    2,    1,    3,    4,
-    1,    3,    5,    3,    5,    1,    2,    1,    2,    1,
-    2,    2,    3,    1,    1,    3,    3,    5,    3,    1,
-    2,    1,    1,    1,    4,    4,    4,    2,    4,    2,
-    1,    1,    2,    2,    4,    4,    1,    2,    2,    2,
-    1,    3,    1,    3,    1,    4,    2,    5,    1,    1,
-    4,    6,    4,    6,    4,    4,    5,    2,    4,    5,
-    2,    6,    4,    3,    0,    2,    3,    8,    6,    1,
-    3,    3,    0,    1,    1,    2,    0,    1,    3,    2,
-    1,    1,    1,    3,    1,    3,    3,    2,    1,    1,
+    2,    2,    3,    1,    3,    1,    2,    1,    4,    2,
+    1,    4,    1,    1,    3,    2,    1,    3,    4,    1,
+    3,    5,    3,    5,    1,    2,    1,    2,    1,    2,
+    2,    3,    1,    1,    1,    3,    3,    1,    2,    1,
+    3,    1,    1,    3,    3,    4,    2,    4,    2,    1,
+    1,    2,    2,    3,    3,    1,    2,    2,    2,    1,
+    3,    1,    3,    1,    4,    2,    5,    1,    1,    4,
+    6,    4,    6,    4,    4,    5,    2,    4,    5,    2,
+    6,    4,    3,    0,    2,    3,    8,    6,    1,    3,
+    3,    0,    1,    1,    2,    0,    1,    3,    2,    1,
+    1,    1,    3,    1,    3,    3,    2,    1,    1,    1,
     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
     1,    1,    1,    4,    6,    4,    5,    1,    1,    1,
     3,    1,    3,    1,    3,    1,    1,    2,    4,    0,
@@ -404,96 +408,95 @@
     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
 };
 final static short yydefred[] = {                         0,
-  245,    0,    0,    0,    2,    0,  260,    0,  313,  314,
-    0,  317,  318,  319,  320,  321,  322,  323,  324,  325,
-  326,  327,  328,  329,  330,  331,  332,  333,  334,  335,
-  336,  337,  338,  339,  340,  341,  342,  343,  344,  345,
-  346,  347,  348,  349,  350,  351,  352,  353,  354,  355,
-  356,  357,  358,  359,  360,  361,  362,  363,  364,  365,
-  366,  367,  368,  369,  370,  371,  372,  373,  374,  375,
-  376,  377,  378,  379,  380,  381,  382,  383,  384,  385,
-  386,  387,  388,  389,  390,  391,  392,  393,  394,  395,
-  396,  397,  398,  399,  400,    0,    0,    0,    0,    0,
-  192,    0,    3,    0,  193,  194,    0,    0,  178,    0,
-  171,  176,  261,   97,   98,   99,  100,  101,  103,    0,
-  315,  315,    0,    0,    4,    0,    0,    5,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    8,   12,    0,   15,    0,    0,    0,    0,    0,   30,
-    0,    0,    0,    0,    0,   62,    0,    0,   94,    0,
-   80,    0,  102,    0,  106,    0,  114,  115,  116,  117,
-  125,    0,    0,  246,    0,    0,    0,    0,    0,  177,
-  191,    0,  248,    0,    0,  157,    0,    0,    0,  162,
-    0,    0,    0,    0,    0,    0,    0,    0,  180,  179,
-    0,    0,    0,    0,    0,    0,  219,  220,    0,    0,
-    0,    0,  202,  201,    0,    0,  207,  315,    0,    0,
-    0,  315,    0,    0,  124,    0,   78,   77,   75,   76,
-    0,    0,    0,    0,    0,  251,    0,  255,  119,  120,
-    0,  122,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  208,    6,    0,    0,    0,    0,    0,  262,  263,
-  264,  265,  266,    0,  267,  268,  269,  270,  271,  272,
-  273,    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,  259,    0,    0,    0,    0,    0,    0,
-    0,  150,  105,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  109,    0,    0,  126,  278,  279,    0,
-    0,    0,  209,  210,    0,  167,    0,    0,    0,  158,
-    0,    0,  161,    0,    0,    0,   10,  149,  189,    0,
-    0,    0,    0,  184,  182,  185,    0,  181,  169,  104,
-  146,  145,    0,    0,  203,  204,    0,    0,  129,    0,
-    0,  253,    0,  247,    0,    0,    0,  123,    0,    0,
-    0,    0,  132,  258,    0,  107,  108,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    9,    0,   16,
-    0,    0,   21,   23,    0,   18,   22,   19,   26,   27,
-   31,   33,   34,   42,   41,   38,   39,   40,   35,   36,
-   37,   45,   46,   47,   44,   48,    0,    0,   56,    0,
-   53,    0,   61,    0,   58,   59,   69,   68,   65,   67,
-   63,   64,   66,   73,   72,   71,    0,    0,    0,    0,
-    0,    0,    0,  250,    0,    0,    0,  152,    0,  151,
-    0,    0,    0,  165,    0,    0,  128,  247,    0,    0,
-    0,    0,  131,    0,  247,    0,    0,    0,  215,    0,
-  197,  199,  166,    0,    0,    0,    0,  195,  196,    7,
-    0,  133,  170,    0,    0,    0,    0,  183,    0,    0,
-  316,    0,    0,    0,    0,  237,  315,    0,  286,    0,
-  315,  247,    0,    0,    0,    0,    0,  302,  293,  257,
-    0,  256,  254,  118,  121,    0,    0,   25,    0,  217,
-    0,    0,   81,    0,  249,    0,  153,  110,    0,    0,
-  316,    0,  287,  111,  316,    0,  159,    0,    0,    0,
-  231,  130,  280,    0,  234,    0,  127,    0,  173,  160,
-  175,    0,  163,   11,  156,  154,  156,  187,  186,  315,
-  139,    0,    0,  205,  206,    0,    0,  288,    0,  138,
-    0,    0,  240,    0,  284,    0,    0,    0,    0,  294,
-    0,    0,    0,    0,  305,    0,  307,    0,    0,  312,
-    0,    0,    0,  315,  315,  112,    0,  113,  274,    0,
-    0,    0,  236,    0,    0,    0,    0,  233,    0,    0,
-    0,    0,  315,  140,    0,    0,    0,    0,    0,    0,
-    0,  276,    0,    0,  295,  298,  300,  292,  296,    0,
-  310,  309,    0,  306,  304,    0,    0,    0,    0,  135,
-  316,  229,    0,    0,    0,    0,  281,    0,  277,  216,
-  155,  188,    0,    0,  232,    0,  291,  242,  239,  241,
-    0,  285,    0,    0,    0,    0,  303,  218,  316,  136,
-  275,  230,    0,    0,    0,    0,    0,    0,  283,  316,
-    0,  289,    0,  297,  299,  301,  308,  137,    0,  225,
-    0,    0,    0,  228,  221,  223,    0,    0,  238,  316,
-    0,  316,    0,  143,  142,  224,  226,  222,    0,  227,
+  244,    0,    0,    0,    2,    0,  260,    0,    0,    0,
+  313,  314,    0,  317,  318,  319,  320,  321,  322,  323,
+  324,  325,  326,  327,  328,  329,  330,  331,  332,  333,
+  334,  335,  336,  337,  338,  339,  340,  341,  342,  343,
+  344,  345,  346,  347,  348,  349,  350,  351,  352,  353,
+  354,  355,  356,  357,  358,  359,  360,  361,  362,  363,
+  364,  365,  366,  367,  368,  369,  370,  371,  372,  373,
+  374,  375,  376,  377,  378,  379,  380,  381,  382,  383,
+  384,  385,  386,  387,  388,  389,  390,  391,  392,  393,
+  394,  395,  396,  397,  398,  399,  400,    0,    0,    0,
+    0,    0,    3,    0,  192,  193,    0,    0,    0,  177,
+    0,  170,  175,  261,   97,   98,   99,  100,  101,    0,
+    0,  103,    0,  315,  315,    0,    0,    4,    0,    0,
+    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    8,   12,    0,   15,  132,    0,    0,
+    0,    0,   30,    0,    0,    0,    0,    0,   62,    0,
+    0,   94,    0,   80,    0,  102,    0,  106,    0,  114,
+  115,  116,  117,  125,    0,    0,  245,    0,    0,    0,
+  259,    0,    0,    0,    0,  176,  189,    0,  247,    0,
+    0,  156,    0,    0,    0,  161,    0,    0,    0,    0,
+    0,    0,    0,  179,  178,    0,    0,    0,    0,    0,
+    0,    0,    0,  218,  219,    0,    0,    0,    0,  201,
+  200,    0,    0,  206,  315,    0,    0,    0,  315,    0,
+    0,  124,    0,   78,   77,   75,   76,    0,    0,    0,
+    0,    0,  250,    0,  254,  119,  120,  122,    0,    0,
+    0,    0,    0,    0,    0,    0,  207,    6,    0,    0,
+    0,    0,    0,  262,  263,  264,  265,  266,    0,  267,
+  268,  269,  270,  271,  272,  273,    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,  258,
+    0,    0,    0,    0,    0,    0,  150,  105,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  109,    0,
+    0,  126,  278,  279,    0,  194,  195,    0,    0,  208,
+  209,  166,    0,    0,    0,  157,    0,    0,  160,  191,
+    0,   10,  149,  187,    0,    0,  154,  185,    0,    0,
+  183,  181,  184,    0,  180,  168,  118,  121,  104,  146,
+  145,    0,    0,    0,    0,  202,  203,  129,    0,    0,
+  252,    0,  246,    0,    0,    0,  123,    0,    0,    0,
+    0,  257,    0,  107,  108,    0,    0,    0,    0,    0,
+    0,    0,    0,    9,    0,   16,    0,    0,   21,   23,
+    0,   18,   22,   19,   26,   27,   31,   33,   34,   42,
+   41,   38,   39,   40,   35,   36,   37,   45,   46,   47,
+   44,   48,    0,    0,   56,    0,   53,    0,   61,    0,
+   58,   59,   69,   68,   65,   67,   63,   64,   66,   73,
+   72,   71,    0,    0,    0,    0,    0,    0,    0,  249,
+    0,    0,    0,  152,    0,  151,    0,    0,    0,  164,
+    0,    0,  128,  246,    0,    0,    0,  131,    0,    0,
+  246,    0,    0,    0,  214,    0,  196,  198,  165,    0,
+    0,    0,    0,    7,    0,  133,  169,    0,    0,  182,
+    0,    0,  316,  204,  205,    0,    0,  236,  315,    0,
+  286,    0,  315,  246,    0,    0,    0,    0,    0,  302,
+  293,  256,    0,  255,  253,    0,    0,   25,    0,  216,
+    0,    0,   81,    0,  248,    0,  153,  110,    0,    0,
+  316,    0,  287,  111,  158,    0,    0,    0,  230,  130,
+  316,    0,  280,    0,  233,    0,  127,    0,  172,  159,
+  174,    0,  162,   11,  155,  186,  315,  139,    0,    0,
+    0,    0,  288,    0,  138,    0,    0,  239,    0,  284,
+    0,    0,    0,  305,    0,  307,    0,    0,    0,    0,
+  294,    0,    0,    0,  312,    0,  315,  315,  112,    0,
+  113,    0,    0,  235,  274,    0,    0,    0,    0,    0,
+  232,    0,    0,  315,  140,    0,    0,    0,    0,    0,
+    0,    0,  276,    0,    0,  310,  309,    0,  306,  304,
+  295,  298,  300,  292,  296,    0,    0,    0,    0,    0,
+  135,  228,    0,  316,    0,    0,    0,  281,    0,  277,
+  215,    0,    0,  231,    0,  291,  241,  238,  240,    0,
+  285,    0,    0,    0,    0,  303,  217,  316,  136,  229,
+  275,    0,    0,    0,    0,    0,    0,  283,  316,    0,
+  289,    0,  308,  297,  299,  301,  137,    0,  224,    0,
+    0,    0,  227,  220,  222,    0,    0,  237,  316,    0,
+  316,    0,  143,  142,  223,  225,  221,    0,  226,
 };
 final static short yydgoto[] = {                          3,
-  193,    5,  547,  179,  140,  372,  346,  141,    6,  347,
-  143,  144,  145,  407,  437,  146,  272,  307,  105,  106,
-  149,  150,  151,  416,  152,  153,  154,  431,  155,  435,
-  156,  439,  157,  446,  158,  159,  160,  161,  234,  381,
-  162,  163,  164,  313,  165,  235,  166,  324,  378,  573,
-  507,  580,  167,  168,  169,  170,  225,  171,  172,  327,
-  474,  215,  463,  221,  508,  363,  571,  572,  314,  354,
-  495,  185,  186,  187,  188,  189,  190,  109,  110,  111,
-  112,  200,  201,  355,  356,  216,  217,  173,  218,  480,
-  237,  615,  686,  704,  328,  329,  223,  582,  583,  509,
-  238,  113,  586,  554,  617,  578,  591,  382,  592,  518,
-  515,  596,  597,
+  198,    5,  545,  185,  143,  381,  351,  144,    6,  352,
+  146,  147,  148,  413,  443,  149,  277,  312,  105,  106,
+  152,  153,  154,  422,  155,  156,  157,  437,  158,  441,
+  159,  445,  160,  452,  161,  162,  163,  164,  241,  390,
+  107,  165,  166,  167,  318,  168,  242,  169,  329,  387,
+  570,  509,  575,  170,  171,  172,  173,  232,  174,  175,
+  332,  479,  222,  469,  228,  510,  372,  568,  569,  319,
+  361,  191,  192,  193,  194,  195,  196,  110,  111,  112,
+  113,  205,  206,  362,  363,  223,  224,  176,  225,  486,
+  244,  608,  675,  693,  333,  334,  230,  577,  578,  511,
+  245,  114,  581,  554,  610,  573,  592,  391,  593,  520,
+  516,  585,  586,
 };
-final static short yysindex[] = {                      -302,
-    0,13340,    0,15221,    0, -301,    0,17299,    0,    0,
-17299,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+final static short yysindex[] = {                      -318,
+    0,15796,    0,14020,    0, -306,    0, -166, -162,19647,
+    0,    0,19647,    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,
@@ -501,72 +504,71 @@
     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,16165,17299, 9865,  -30,   -7,
-    0, -260,    0,   77,    0,    0,   87,  -71,    0,   83,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,15569,
-    0,    0,17299,16631,    0,17299,16510,    0,   87,16631,
-17299,16165,16165,16165, -289,    2,  -68, -260,12754, -260,
-    0,    0,   81,    0,    0, 1136, -235, -210, -172,    0,
-   14,   24,  133,  261,  -19,    0, -178,12284,    0,  223,
-    0,11949,    0,  -18,    0,  785,    0,    0,    0,    0,
-    0,  172, -133,    0,  253,  257,17299,17299,16631,    0,
-    0,16976,    0,  -96,  226,    0,  -11,  228,    3,    0,
-   71,   79,15221,  284,15569, -260,  -79,   37,    0,    0,
-   12,15569,  152,13685,13685,  253,    0,    0,17299,17299,
-  232,  240,    0,    0,  242,  -44,    0,    0,  257, -260,
-  242,    0,  -24,  259,    0,18015,    0,    0,    0,    0,
-17299,15221,  -34,  297,   27,    0,  353,    0,    0,    0,
-  144,    0,  157,  362,17299,17299,  286,  296,    0,   30,
-   77,    0,    0,12408,15221,  223,15569,15221,    0,    0,
-    0,    0,    0,15221,    0,    0,    0,    0,    0,    0,
-    0,15693,15221,15221,15569,15569,15569,16041,13340,13340,
-16041,16041,16041,15569,15569,15569,15569,15569,15569,15569,
-16041,15569,16041,16041,16041,16041,16041,16041,16041,16041,
-18713, -260,17299,    0,  223, -260, -127,18713, -127,  223,
-  388,    0,    0,   66,13340, 9985,   87,   87,  242,  242,
-   87, -260,18134,    0, -260,17555,    0,    0,    0,17299,
-15569,15569,    0,    0,   77,    0,13340,  383, -260,    0,
-  308, -260,    0,  330,  338, -260,    0,    0,    0,  423,
-13340,  343,  347,    0,    0,    0,   37,    0,    0,    0,
-    0,    0,  242,  172,    0,    0,  214,  217,    0,17299,
-  436,    0,   53,    0,  437,16631, -260,    0, -260, -260,
-  143,   97,    0,    0, -260,    0,    0, -289, -260,  357,
-  358,    0,  253,  257,  229,  230,15221,    0,12754,    0,
- -127, -172,    0,    0,  -29,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  -84,  -84,    0,  261,
-    0,  261,    0,  -19,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0, -127,  223,  399,  223,
- -127,  452,  -54,    0, -127,  223, -127,    0,  388,    0,
-  242,  -96,  227,    0,  242,  259,    0,    0,  242,15097,
-13220,  146,    0,  242,    0,  242,13340,  242,    0,  470,
-    0,    0,    0,13804,13340,13804, 9985,    0,    0,    0,
-12408,    0,    0, -260,17299,13340,19119,    0,  244, -150,
-    0,  415,  416,  470,13220,    0,    0,    0,    0, -260,
-    0,    0,   68,19410,  501, -260,17299,    0,    0,    0,
-  -34,    0,    0,    0,    0,  419,  420,    0,   77,    0,
-  138, -127,    0, -127,    0, -127,    0,    0,15221,  269,
-    0,    0,    0,    0,    0, -260,    0,  508,13220,15569,
-    0,    0,    0,    0,    0,  242,    0, -260,    0,    0,
-    0,  -96,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  287,  244,    0,    0,  516,  288,    0,  281,    0,
-  150,  207,    0,  527,    0,  444, -260,18832,18832,    0,
-  447, -260,  517,  517,    0,   15,    0,  517,  533,    0,
-    0,    0, -260,    0,    0,    0, -197,    0,    0,  451,
-  519,  540,    0,  -10, -260,    0,  457,    0,17299,  461,
-  462,13685,    0,    0,  519,13340,  242,13340,  519, -260,
-13340,    0,  307, -260,    0,    0,    0,    0,    0, -213,
-    0,    0, -260,    0,    0,  517,  241,  242,  -62,    0,
-    0,    0,  519,   87,18951,18951,    0, -260,    0,    0,
-    0,    0,  172,13685,    0,  242,    0,    0,    0,    0,
-  246,    0, -260,18832,18832,19410,    0,    0,    0,    0,
-    0,    0, -103,13220,  -36,  242,  159,  242,    0,    0,
-  242,    0,  519,    0,    0,    0,    0,    0,   87,    0,
-  550,15221,13220,    0,    0,    0,  244,  244,    0,    0,
-  519,    0,  553,    0,    0,    0,    0,    0,  519,    0,
+    0,    0,    0,    0,    0,    0,    0,16398,19647,11865,
+   52, -267,    0,   64,    0,    0,    0,   90,   21,    0,
+   72,    0,    0,    0,    0,    0,    0,    0,    0, -116,
+ -112,    0,14372,    0,    0,19647,19057,    0,19647,16870,
+    0,   90,19057,19647,16398,16398,16398, -325,    6,  -99,
+ -267,14977, -267,    0,    0,  116,    0,    0,  782, -222,
+ -216, -197,    0,   74,    3, -154,  248,  -22,    0, -188,
+12451,    0,  153,    0,12112,    0,   63,    0,  -12,    0,
+    0,    0,    0,    0,  100, -158,    0,  121,  129,  208,
+    0,  232,19647,19647,19057,    0,    0,16745,    0, -123,
+  209,    0,  -30,  217,  -26,    0,14372,14020,  276,14372,
+ -267,  -87,  390,    0,    0,   70,14372,  195,  212,  104,
+15919,15919,  208,    0,    0,   88,   93,19647,19647,    0,
+    0,  224,  -64,    0,    0,  232, -267,  224,    0,  -63,
+  238,    0,17929,    0,    0,    0,    0,19647,14020,  -54,
+  273,   28,    0,  326,    0,    0,    0,    0,  337,  125,
+  131,19647,19647,   52,   -4,   64,    0,    0,12579,14020,
+  153,14372,14020,    0,    0,    0,    0,    0,14020,    0,
+    0,    0,    0,    0,    0,    0,14500,14020,14020,14372,
+14372,14372,14852,15796,15796,14852,14852,14852,14372,14372,
+14372,14372,14372,14372,14372,14852,14372,14852,14852,14852,
+14852,14852,14852,14852,14852,18643, -267,19647,  153,    0,
+ -267, -174,18643, -174,  153,   39,    0,    0,   78,15796,
+11989,   90,   90,  224,  224,   90,18052, -267,    0, -267,
+17461,    0,    0,    0,19647,    0,    0,14372,14372,    0,
+    0,    0,15796,  356, -267,    0,  278, -267,    0,    0,
+ -267,    0,    0,    0,  366,15796,    0,    0, -267,15796,
+    0,    0,    0,  390,    0,    0,    0,    0,    0,    0,
+    0,  224,  100,  301,  306,    0,    0,    0,19647,  395,
+    0,  158,    0,  402,19057, -267,    0, -267, -267,   56,
+   58,    0, -267,    0,    0, -325, -267,    0,  320,  324,
+  208,  232,14020,    0,14977,    0, -174, -197,    0,    0,
+  -25,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  -16,  -16,    0,  248,    0,  248,    0,  -22,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0, -174,  153,  357,  153, -174,  411,  -44,    0,
+ -174,  153, -174,    0,   39,    0,  224, -123,  168,    0,
+  224,  238,    0,    0,  224,15447,   59,    0,  224,13892,
+    0,  224,15796,  224,    0,  414,    0,    0,    0,16266,
+15796,16266,11989,    0,12579,    0,    0,  330,  334,    0,
+  198, -125,    0,    0,    0,  414,15447,    0,    0,    0,
+    0, -267,    0,    0,19356,  434, -142, -267,19647,    0,
+    0,    0,  -54,    0,    0,    0,    0,    0,   64,    0,
+  211, -174,    0, -174,    0, -174,    0,    0,14020,  197,
+    0,    0,    0,    0,    0,  435,15447,14372,    0,    0,
+    0, -267,    0,    0,    0,  224,    0, -267,    0,    0,
+    0, -123,    0,    0,    0,    0,    0,    0,  206,  198,
+  439,  210,    0,  213,    0,   81,  223,    0,  463,    0,
+  379,  456,  456,    0,  -20,    0,  456, -267,18766,18766,
+    0,  391, -267,  474,    0, -267,    0,    0,    0, -107,
+    0,  464,  484,    0,    0,  408, -114, -267,    0,  409,
+    0,19647,15919,    0,    0,  464,15796,  224,15796,  464,
+ -267,15796,    0,  240, -267,    0,    0, -267,    0,    0,
+    0,    0,    0,    0,    0, -214,  456,  230,  224,  -52,
+    0,    0,  464,    0,   90,18889,18889,    0, -267,    0,
+    0,  100,15919,    0,  224,    0,    0,    0,    0,  236,
+    0,19356, -267,18766,18766,    0,    0,    0,    0,    0,
+    0, -106,15447,   -9,  224,  102,  224,    0,    0,  224,
+    0,  464,    0,    0,    0,    0,    0,   90,    0,  495,
+14020,15447,    0,    0,    0,  198,  198,    0,    0,  464,
+    0,  496,    0,    0,    0,    0,    0,  464,    0,
 };
-final static short yyrindex[] = {                      9400,
-    0,   74,    0,  484,    0, 8366,    0,    0,    0,    0,
+final static short yyrindex[] = {                      9523,
+    0,  145,    0,  501,    0, 8628,    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,
@@ -575,85 +577,84 @@
     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, 1339,    0,  -37,    0,    0,
-    0,14749,    0, 8186,    0,    0,    0,    0,    0, 8967,
-    0,    0,    0,    0,    0,    0,    0,    0,    0, 1339,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0, 1339, 1339, 1339,14153,    0,    0,14749,   74,  595,
-    0,    0,   44,    0,  982,  670,    0,    0, 9167,    0,
- 9013, 8138, 7722, 7306, 7108,    0, 7069, 6690,    0, 4980,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,17674,17095,    0, 8514, 8747,    0,    0,    0,    0,
-    0,    0,    0,  -15,    0,    0,   29,    0,  503,    0,
-    0,    0, 1339,    0, 1339,14749,    0,    0,    0,    0,
-    0, 1339,    0,  -56,  182,11709,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,18475,    0,    0,11829,14749,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  719,   46,    0,    0,    0,   36,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,10446,    0,
-  862,    0,    0,  538,  580,    0, 1339, 1339,    0,    0,
-    0,    0,    0, 1339,    0,    0,    0,    0,    0,    0,
-    0, 1339, 1339, 1339, 1339, 1339, 1339, 1339,   74,   74,
- 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339,
- 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339,
-    0,14153,    0,    0, 5396,14277, 1398,    0, 2700, 5550,
-    0,    0,    0,    0,   74,   74,    0,    0,    0,    0,
-    0,14625,    0,    0,  197,    0,    0,    0,    0,    0,
- 1339, 1339,    0,    0,  -33,    0,   74, 8780,12875,    0,
- 8815, 9520,    0,    0,    0,    9,    0,    0,    0,    0,
-   74,19816,19578,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0, -109,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  -63,    0,  -21,19291,
- -112,    0,    0,    0,14749,    0,    0,14749,14749,    0,
-    0, 1552,10787,10907,    0,    0, 1339,    0,   74,    0,
-    5, 9200,    0,    0,14749,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0, 7940, 7976,    0, 7524,
-    0, 7560,    0, 7144,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0, 3116, 5966,    0, 6120,
- 1968,    0,    0,    0, 3270, 6536, 3686,    0,    0,    0,
-    0,  318,    0,    0,    0,    0,    0,    0,    0, 1339,
-  -41,  478,    0,    0,    0,    0,   74,    0,    0,17436,
-    0,    0,    0,   74,   74,   74,   74,    0,    0,    0,
-  855,    0,    0,14749,    0,   74,    0,    0,  334,    0,
-    0,    0,    0,18594,  -41,    0,    0, 2122,    0,14749,
-    0,    0,  480,  570,    0,19291,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,10326,    0,
-    0, 3840,    0, 4256,    0, 4410,    0,    0, 1339, 4826,
-    0, 2538,    0,    0,    0,  487,    0,    0,  -41, 1339,
-    0,    0,    0,  440,    0,    0,    0,19935,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  334,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  331,  487,    0,    0,    0,
-    0,  487,  -14,  -14,    0,  576,    0, -112,    0,    0,
-11248,11368,14749,    0,    0,    0,    0,    0,    0,    0,
-  478,    0,    0,    0,  197,  -42,    0,    0,    0,    0,
-    0,  182,    0,    0,  478,   74,    0,   74,  478,14749,
-   74,    0,    0,  -22,    0,    0,    0,    0,    0,  500,
-    0,    0,19697,    0,    0, -112,    0,    0,    0,    0,
-    0,    0,  478,    0,    0,    0,    0,  487,    0,    0,
-    0,    0, -109,  -56,    0,    0,    0,    0,    0,    0,
-    0,    0,  487,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  -41,  478,    0,  478,    0,    0,    0,
-    0,    0,  478,    0,    0,    0,    0,    0,    0,    0,
-    0, 1339,  -41,    0,    0,    0,  334,  334,    0,    0,
-  478,    0,    0,    0,    0,    0,    0,    0,  478,    0,
+    0,    0,    0,    0,    0,    0,    0,  661,    0,  -38,
+ 8750,13540,    0, 8786,    0,    0,  950,    0,    0,    0,
+  719,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  661,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  661,  661,  661,12932,    0,    0,
+13540,  145,  540,    0,    0,   44,    0,    0,  113,    0,
+    0, 9287,    0, 7381, 8292, 7852, 7640, 7200,    0, 7164,
+ 7128,    0, 5394,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,17584,17215,    0,    0,    0, 9017,
+    0, 9053,    0,    0,    0,    0,    0,    0,    0,  -37,
+    0,    0,   23,    0,  451,    0,  661,  661,    0,  661,
+13540,    0,    0,    0,    0,    0,  661,    0,    0,    0,
+  -61,  152,11050,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,18397,    0,    0,11395,13540,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0, 1334,   36,
+    0,    0,    0,   33,    0,    0,    0,    0,    0,    0,
+    0,    0,    0, 9646,    0, 1371,    0,    0,  881, 1108,
+    0,  661,  661,    0,    0,    0,    0,    0,  661,    0,
+    0,    0,    0,    0,    0,    0,  661,  661,  661,  661,
+  661,  661,  661,  145,  145,  661,  661,  661,  661,  661,
+  661,  661,  661,  661,  661,  661,  661,  661,  661,  661,
+  661,  661,  661,  661,  661,    0,12932,    0, 5552,    0,
+13060, 1498,    0, 3082, 5972,    0,    0,    0,    0,  145,
+  145,    0,    0,    0,    0,    0,    0,13412,    0,  305,
+    0,    0,    0,    0,    0,    0,    0,  661,  661,    0,
+    0,    0,  145, 9086,15324,    0, 9254,11518,    0,    0,
+  -32,    0,    0,    0,    0,  145,    0,    0,13540,  145,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  -31,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  -50,    0,19233,  -73,  -93,
+    0,    0,13540,    0,    0,13540,13540, 1918,    0,    0,
+ 9991,10114,  661,    0,  145,    0,  679, 9323,    0,    0,
+13540,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0, 8157, 8234,    0, 7717,    0, 7775,    0, 7335,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0, 3240, 6130,    0, 6550, 2076,    0,    0,    0,
+ 3660, 6708, 3818,    0,    0,    0,    0,  260,    0,    0,
+    0,    0,    0,    0,    0,    4,  424,    0,    0,  661,
+    0,    0,  145,    0,    0,17338,    0,    0,    0,  145,
+  145,  145,  145,    0, 1347,    0,    0,    0,    0,    0,
+  279,    0,    0,    0,    0,18520,    4,    0,    0, 2496,
+    0,13540,    0,    0,  508,    0,  426,19233,    0,    0,
+    0,    0,    0,    0,    0,10459,10582,    0,10927,    0,
+    0, 4238,    0, 4396,    0, 4816,    0,    0,  661, 4974,
+    0, 2662,    0,    0,    0,    0,    4,  661,    0,    0,
+    0,  429,    0,  438,    0,    0,    0,19770,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  279,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  269,  -18,  -18,    0,  516,    0,  -93,  429,    0,    0,
+    0,    0,  429,    0,    0,13540,    0,    0,    0,    0,
+    0,  424,    0,    0,    0,    0,    0,  305,  -72,    0,
+    0,    0,  152,    0,    0,  424,  145,    0,  145,  424,
+13540,  145,    0,    0,  -67,    0,    0,19524,    0,    0,
+    0,    0,    0,    0,    0,  433,  -93,    0,    0,    0,
+    0,    0,  424,    0,    0,    0,    0,    0,  429,    0,
+    0,  -31,  -61,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  429,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    4,  424,    0,  424,    0,    0,    0,    0,
+    0,  424,    0,    0,    0,    0,    0,    0,    0,    0,
+  661,    4,    0,    0,    0,  279,  279,    0,    0,  424,
+    0,    0,    0,    0,    0,    0,    0,  424,    0,
 };
 final static short yygindex[] = {                         0,
-    1,    0,  255,   -2,    0,  -87,  162,  373, -131,    4,
-    0, -248,   34,    0,  337,    0,    0,   19,  119,  176,
-  372,  359, -106,  160,  151,   69,  -55,    0,  112,  342,
-  201,  256,  340,    0,    0,   18,    0,    0, -211, -123,
-  248, -217,   17,    0,  -86,    0,  386,  465,  175, -200,
-  170,  100,    0,    0,   45,    0,    0,  522,    0, -347,
-  323,    0,    0,    0,  183, -202, -501,    0,    0, -254,
- -299, -439, -104,   21,    0,    0, -258,  473, -244,    0,
-    0,    0,    0,  300,    0, -105,    0,    0,  -90,  293,
- -214,    0,    8,  -27, -499,   52,    0,    0,   39, -370,
-  283,    0,  118,    0,    0,    0,    0, -520,    0, -487,
-  161,    0,    6,
+    1,    0,  222,   37,    0,  -98,   80,  302, -137,   -1,
+    0, -250,   -2,    0,  616,    0,    0, -118,  159,  188,
+  307,  290,  532,   86,  179,  118,  -75,    0,  122,  272,
+  182,  374,  268,    0,    0,  189,    0,    0, -217, -126,
+  570,   48, -168,   19,    0,  -78,    0,  375,  385,  105,
+  -13,  107,   42,    0,    0,  -19,    0,    0,  111,    0,
+ -351,  256,    0,    0,    0,  114, -207, -532,    0,    0,
+ -247, -439,  -79,  -24,    0,    0, -264,  413, -169,    0,
+    0,    0,    0,  226,    0,  -96,    0,    0,  -97,  220,
+ -225,    0,  -45, -443, -494,   -3,    0,    0,   -7, -408,
+  216,    0,   51,    0,    0,    0,    0, -513,    0, -501,
+   98,    0,  -43,
 };
-final static int YYTABLESIZE=20315;
+final static int YYTABLESIZE=20154;
 
 //These two tables are not statically initialized, but rather
 //initialized on first use, so that a failure to initialize them
@@ -675,7 +676,7 @@
         yytable = (short[])obInp.readObject();
         yycheck = (short[])obInp.readObject();
         long hash = EYaccFixer.checkhash(yytable, yycheck);
-        if (hash != -1945603369588693761L) {
+        if (hash != 878073795554571773L) {
             throw new RuntimeException(rName + " bad checkhash: " +
                                        hash);
         }
@@ -685,7 +686,7 @@
 }
 
 final static short YYFINAL=3;
-final static short YYMAXTOKEN=416;
+final static short YYMAXTOKEN=420;
 final static String yyname[] = {
 "end-of-file",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,
@@ -705,25 +706,26 @@
 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,"LiteralInteger","LiteralFloat64",
 "LiteralChar","LiteralString","LiteralTwine","Identifier","VerbAss","QuasiOpen",
-"QuasiClose","URI","URIStart","BodyStartWord","BodyNextWord","VTableStartWord",
-"VTableNextWord","BIND","CATCH","CLASS","DEF","DELEGATE","ELSE","ESCAPE",
-"FINALLY","FOR","IF","IN","MATCH","META","PRAGMA","SWITCH","THUNK","TO","TRY",
-"VAR","WHEN","WHILE","DEFINE","ON","SELECT","TYPEDEF","ABSTRACT","AN","AS",
-"ATTRIBUTE","BE","BEGIN","BEHALF","BELIEF","BELIEVE","BELIEVES","CASE","CONST",
-"CONSTRUCTOR","CONTEXT","DECLARE","DEFAULT","DEFMACRO","DEPRECATED","DISPATCH",
-"DO","ENCAPSULATE","ENCAPSULATED","ENCAPSULATES","END","ENSURE","ENUM",
-"EVENTUAL","EVENTUALLY","EXPORT","EXTENDS","FACET","FORALL","FUNCTION","GIVEN",
-"HIDDEN","HIDES","IMPLEMENTS","INTERFACE","IS","KNOW","KNOWS","LAMBDA","LET",
-"METHOD","METHODS","MODULE","NAMESPACE","NATIVE","OBEYS","OCTET","ONEWAY",
-"PACKAGE","PRIVATE","PROTECTED","PUBLIC","RAISES","RELIANCE","RELIANT","RELIES",
-"RELY","REVEAL","SAKE","SIGNED","STATIC","STRUCT","SUCHTHAT","SUPPORTS",
-"SUSPECT","SUSPECTS","SYNCHRONIZED","THIS","THROWS","TRANSIENT","TRUNCATABLE",
-"UNSIGNED","UNUM","USES","USING","UTF8","UTF16","VALUETYPE","VIRTUAL",
-"VOLATILE","WSTRING","EOL","OpLAnd","OpLOr","OpSame","OpNSame","OpButNot",
-"OpLeq","OpABA","OpGeq","OpThru","OpTill","OpAsl","OpAsr","OpFlrDiv","OpMod",
-"OpPow","OpAss","OpAssAdd","OpAssAnd","OpAssAprxDiv","OpAssFlrDiv","OpAssAsl",
-"OpAssAsr","OpAssRemdr","OpAssMod","OpAssMul","OpAssOr","OpAssPow","OpAssSub",
-"OpAssXor","Send","OpWhen","MapsTo","MatchBind","MisMatch","Audit",
+"QuasiClose","DollarIdent","AtIdent","DollarOpen","AtOpen","URI","URIStart",
+"BodyStartWord","BodyNextWord","VTableStartWord","VTableNextWord","BIND",
+"CATCH","CLASS","DEF","DELEGATE","ELSE","ESCAPE","FINALLY","FOR","IF","IN",
+"MATCH","META","PRAGMA","SWITCH","THUNK","TO","TRY","VAR","WHEN","WHILE",
+"DEFINE","ON","SELECT","TYPEDEF","ABSTRACT","AN","AS","ATTRIBUTE","BE","BEGIN",
+"BEHALF","BELIEF","BELIEVE","BELIEVES","CASE","CONST","CONSTRUCTOR","CONTEXT",
+"DECLARE","DEFAULT","DEFMACRO","DEPRECATED","DISPATCH","DO","ENCAPSULATE",
+"ENCAPSULATED","ENCAPSULATES","END","ENSURE","ENUM","EVENTUAL","EVENTUALLY",
+"EXPORT","EXTENDS","FACET","FORALL","FUNCTION","GIVEN","HIDDEN","HIDES",
+"IMPLEMENTS","INTERFACE","IS","KNOW","KNOWS","LAMBDA","LET","METHOD","METHODS",
+"MODULE","NAMESPACE","NATIVE","OBEYS","OCTET","ONEWAY","PACKAGE","PRIVATE",
+"PROTECTED","PUBLIC","RAISES","RELIANCE","RELIANT","RELIES","RELY","REVEAL",
+"SAKE","SIGNED","STATIC","STRUCT","SUCHTHAT","SUPPORTS","SUSPECT","SUSPECTS",
+"SYNCHRONIZED","THIS","THROWS","TRANSIENT","TRUNCATABLE","UNSIGNED","UNUM",
+"USES","USING","UTF8","UTF16","VALUETYPE","VIRTUAL","VOLATILE","WSTRING","EOL",
+"OpLAnd","OpLOr","OpSame","OpNSame","OpButNot","OpLeq","OpABA","OpGeq","OpThru",
+"OpTill","OpAsl","OpAsr","OpFlrDiv","OpMod","OpPow","OpAss","OpAssAdd",
+"OpAssAnd","OpAssAprxDiv","OpAssFlrDiv","OpAssAsl","OpAssAsr","OpAssRemdr",
+"OpAssMod","OpAssMul","OpAssOr","OpAssPow","OpAssSub","OpAssXor","Send",
+"OpWhen","MapsTo","MatchBind","MisMatch","Audit",
 };
 final static String yyrule[] = {
 "$accept : start",
@@ -743,7 +745,7 @@
 "seq : assigns ';'",
 "assigns : assign",
 "assigns : assigns ';' assign",
-"assigns : define ident",
+"assigns : define noun",
 "nAssign : assign",
 "nAssign : plural",
 "assign : cond",
@@ -804,7 +806,7 @@
 "prefix : '!' prim",
 "prefix : '~' prim",
 "prefix : '-' prim",
-"prefix : '&' ident",
+"prefix : '&' noun",
 "postfix : call",
 "postfix : metaExpr",
 "postfix : postfix '[' argList ']'",
@@ -828,7 +830,7 @@
 "prim : LiteralChar",
 "prim : LiteralString",
 "prim : LiteralTwine",
-"prim : noun",
+"prim : nounExpr",
 "prim : URI",
 "prim : URIStart add '>'",
 "prim : quasiParser quasiExpr",
@@ -844,10 +846,10 @@
 "prim : whenExpr",
 "prim : ifExpr",
 "prim : macro",
-"prim : '$' '{' LiteralInteger '}'",
+"prim : DollarOpen LiteralInteger '}'",
 "prim : '$' LiteralInteger",
 "prim : '$' '$'",
-"prim : '@' '{' LiteralInteger '}'",
+"prim : AtOpen LiteralInteger '}'",
 "prim : '@' LiteralInteger",
 "prim : SELECT parenExpr caseList",
 "prim : TYPEDEF oType",
@@ -858,7 +860,7 @@
 "object : CLASS classHead body",
 "object : begin '_' funcHead body",
 "object : begin '_' body",
-"noun : ident",
+"nounExpr : noun",
 "parenExpr : '(' eExpr ')'",
 "ifExpr : begin IF parenExpr body",
 "ifExpr : begin IF parenExpr body ELSE ifExpr",
@@ -880,9 +882,8 @@
 "quasiExpr : innerExprs QuasiClose",
 "innerExprs : QuasiOpen innerExpr",
 "innerExprs : innerExprs QuasiOpen innerExpr",
-"innerExpr : '$' quasiAgain ident",
-"innerExpr : '$' '{' eExpr quasiAgain '}'",
-"quasiAgain :",
+"innerExpr : DollarIdent",
+"innerExpr : DollarOpen eExpr '}'",
 "patternList : emptyBr",
 "patternList : patterns br",
 "patterns : pattern",
@@ -912,37 +913,37 @@
 "innerThings : innerThings QuasiOpen innerThing",
 "innerThing : innerExpr",
 "innerThing : innerPattern",
-"innerPattern : '@' quasiAgain ident",
-"innerPattern : '@' quasiAgain '_'",
-"innerPattern : '@' '{' pattern quasiAgain '}'",
-"namer : ident ':' order",
-"namer : ident",
-"namer : '&' ident",
+"innerPattern : AtIdent",
+"innerPattern : AtOpen pattern '}'",
+"namer : noun ':' order",
+"namer : noun",
+"namer : '&' noun",
 "namer : '_'",
+"namer : '_' ':' order",
 "namer : binder",
 "namer : varNamer",
-"namer : '$' '{' LiteralInteger '}'",
-"namer : '@' '{' LiteralInteger '}'",
-"binder : BIND ident ':' order",
-"binder : BIND ident",
-"varNamer : VAR ident ':' order",
-"varNamer : VAR ident",
-"oName : ident",
+"namer : DollarOpen LiteralInteger '}'",
+"namer : AtOpen LiteralInteger '}'",
+"binder : BIND noun ':' order",
+"binder : BIND noun",
+"varNamer : VAR noun ':' order",
+"varNamer : VAR noun",
+"oName : noun",
 "oName : '_'",
-"oName : BIND ident",
-"oName : VAR ident",
-"oName : '$' '{' LiteralInteger '}'",
-"oName : '@' '{' LiteralInteger '}'",
+"oName : BIND noun",
+"oName : VAR noun",
+"oName : DollarOpen LiteralInteger '}'",
+"oName : AtOpen LiteralInteger '}'",
 "oName : litString",
 "defName : define oName",
-"defName : BIND ident",
-"defName : VAR ident",
+"defName : BIND noun",
+"defName : VAR noun",
 "audits : oName",
-"audits : oName Audit nouns",
+"audits : oName Audit nounExprs",
 "defAudits : defName",
-"defAudits : defName Audit nouns",
-"nouns : noun",
-"nouns : nouns ',' br noun",
+"defAudits : defName Audit nounExprs",
+"nounExprs : nounExpr",
+"nounExprs : nounExprs ',' br nounExpr",
 "plural : '(' ')'",
 "plural : '(' eExpr ',' args ')'",
 "litString : LiteralString",
@@ -984,8 +985,9 @@
 "maps : map",
 "maps : maps ',' map",
 "map : eExpr MapsTo eExpr",
-"map : MapsTo noun",
+"map : MapsTo nounExpr",
 "verb : ident",
+"noun : ident",
 "ident : Identifier",
 "ident : reserved",
 "assignop : OpAssAdd",
@@ -1035,10 +1037,10 @@
 "pTypeList : br pTypes br",
 "pTypes : pType",
 "pTypes : pTypes ',' br pType",
-"pType : ident optType",
+"pType : noun optType",
 "pType : '_' optType",
 "optType :",
-"optType : ':' noun",
+"optType : ':' nounExpr",
 "metaoid : META",
 "metaoid : PRAGMA",
 "begin :",
@@ -1129,7 +1131,7 @@
 "reserved : WSTRING",
 };
 
-//#line 1171 "e.y"
+//#line 1181 "e.y"
 
 /**
  *
@@ -1305,7 +1307,7 @@
     } catch (IOException ex) {
         yyerror("io: " + ex);
     }
-    yytext = token.token();
+    yytext = token.getText();
     yylval = token;
     return token.tokenType();
 }
@@ -1375,6 +1377,10 @@
     TheTokens[VerbAss]          = "verb-assign";
     TheTokens[QuasiOpen]        = "quasi-open";
     TheTokens[QuasiClose]       = "quasi-close";
+    TheTokens[DollarIdent]      = "dollar-identifier-hole";
+    TheTokens[AtIdent]          = "at-identifier-hole";
+    TheTokens[DollarOpen]       = "dollar-open-hole";
+    TheTokens[AtOpen]           = "at-open-hole";
     TheTokens[URI]              = "uniform-resource-identifier";
     TheTokens[URIStart]         = "uri-protocol-with-colon";
     TheTokens[BodyStartWord]    = "body-start-word";
@@ -1647,7 +1653,7 @@
 static public boolean isContinuer(int tokenType) {
     return TheContinuers[tokenType];
 }
-//#line 5636 "EParser.java"
+//#line 5610 "EParser.java"
 //###############################################################
 // method: yylexdebug : check lexer state
 //###############################################################
@@ -1794,1027 +1800,1027 @@
       {
 //########## USER-SUPPLIED ACTIONS ##########
 case 1:
-//#line 149 "e.y"
+//#line 153 "e.y"
 { myEscape.run(null); }
 break;
 case 2:
-//#line 150 "e.y"
+//#line 154 "e.y"
 { myEscape.run(val_peek(0)); }
 break;
 case 3:
-//#line 152 "e.y"
+//#line 156 "e.y"
 { myEscape.run(val_peek(0)); }
 break;
 case 5:
-//#line 160 "e.y"
+//#line 164 "e.y"
 { pocket("define"); }
 break;
 case 6:
-//#line 169 "e.y"
+//#line 173 "e.y"
 { yyval = val_peek(1); }
 break;
 case 7:
-//#line 173 "e.y"
+//#line 177 "e.y"
 { yyval = val_peek(1); }
 break;
 case 9:
-//#line 184 "e.y"
+//#line 188 "e.y"
 { yyval = sequence(val_peek(2), val_peek(0)); }
 break;
 case 11:
-//#line 189 "e.y"
+//#line 193 "e.y"
 { yyval = sequence(val_peek(2), val_peek(0)); }
 break;
 case 12:
-//#line 197 "e.y"
+//#line 201 "e.y"
 { yyval = oneExpr(val_peek(0)); }
 break;
 case 16:
-//#line 212 "e.y"
+//#line 216 "e.y"
 { yyval = sequence(val_peek(2), val_peek(0)); }
 break;
 case 17:
-//#line 213 "e.y"
+//#line 217 "e.y"
 { yyval = forward(val_peek(0)); }
 break;
 case 18:
-//#line 228 "e.y"
+//#line 232 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 21:
-//#line 233 "e.y"
+//#line 237 "e.y"
 { yyval = assign(val_peek(2),     val_peek(0)); }
 break;
 case 22:
-//#line 234 "e.y"
+//#line 238 "e.y"
 { yyval = update(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 23:
-//#line 235 "e.y"
+//#line 239 "e.y"
 { yyval = assAsr(val_peek(2),     val_peek(0)); }
 break;
 case 24:
-//#line 236 "e.y"
+//#line 240 "e.y"
 { yyval = update(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 25:
-//#line 238 "e.y"
+//#line 242 "e.y"
 { yyval = define(val_peek(2), val_peek(0)); }
 break;
 case 26:
-//#line 239 "e.y"
+//#line 243 "e.y"
 { yyval = define(val_peek(2), val_peek(0)); }
 break;
 case 27:
-//#line 240 "e.y"
+//#line 244 "e.y"
 { yyval = define(val_peek(2), val_peek(0)); }
 break;
 case 29:
-//#line 249 "e.y"
+//#line 253 "e.y"
 { yyval = condOr(val_peek(2), val_peek(0)); }
 break;
 case 31:
-//#line 258 "e.y"
+//#line 262 "e.y"
 { yyval = condAnd(val_peek(2), val_peek(0)); }
 break;
 case 33:
-//#line 267 "e.y"
+//#line 271 "e.y"
 { yyval = same(val_peek(2), val_peek(0)); }
 break;
 case 34:
-//#line 268 "e.y"
+//#line 272 "e.y"
 { yyval = not(same(val_peek(2), val_peek(0))); }
 break;
 case 35:
-//#line 269 "e.y"
+//#line 273 "e.y"
 { yyval = call(val_peek(2), "and", val_peek(0)); }
 break;
 case 36:
-//#line 270 "e.y"
+//#line 274 "e.y"
 { yyval = call(val_peek(2), "or", val_peek(0)); }
 break;
 case 37:
-//#line 271 "e.y"
+//#line 275 "e.y"
 { yyval = call(val_peek(2), "xor", val_peek(0)); }
 break;
 case 38:
-//#line 272 "e.y"
+//#line 276 "e.y"
 { yyval = call(val_peek(2), "butNot", val_peek(0)); }
 break;
 case 39:
-//#line 274 "e.y"
+//#line 278 "e.y"
 { yyval = matchBind(val_peek(2), val_peek(0)); }
 break;
 case 40:
-//#line 275 "e.y"
+//#line 279 "e.y"
 { yyval = not(matchBind(val_peek(2), val_peek(0))); }
 break;
 case 41:
-//#line 287 "e.y"
+//#line 291 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 44:
-//#line 292 "e.y"
+//#line 296 "e.y"
 { yyval = lessThan(val_peek(2), val_peek(0)); }
 break;
 case 45:
-//#line 293 "e.y"
+//#line 297 "e.y"
 { yyval = leq(val_peek(2), val_peek(0)); }
 break;
 case 46:
-//#line 294 "e.y"
+//#line 298 "e.y"
 { yyval = asBigAs(val_peek(2), val_peek(0)); }
 break;
 case 47:
-//#line 295 "e.y"
+//#line 299 "e.y"
 { yyval = geq(val_peek(2), val_peek(0)); }
 break;
 case 48:
-//#line 296 "e.y"
+//#line 300 "e.y"
 { yyval = greaterThan(val_peek(2), val_peek(0)); }
 break;
 case 50:
-//#line 305 "e.y"
+//#line 309 "e.y"
 { yyval = thru(val_peek(2), val_peek(0)); }
 break;
 case 51:
-//#line 306 "e.y"
+//#line 310 "e.y"
 { yyval = till(val_peek(2), val_peek(0)); }
 break;
 case 53:
-//#line 315 "e.y"
+//#line 319 "e.y"
 { yyval = call(val_peek(2), "shiftLeft", val_peek(0)); }
 break;
 case 54:
-//#line 316 "e.y"
+//#line 320 "e.y"
 { yyval = call(val_peek(2), "shiftLeft",
                                             list(call(val_peek(0), "negate", list())));
                                 }
 break;
 case 55:
-//#line 326 "e.y"
+//#line 330 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 58:
-//#line 331 "e.y"
+//#line 335 "e.y"
 { yyval = call(val_peek(2), "add", val_peek(0)); }
 break;
 case 59:
-//#line 332 "e.y"
+//#line 336 "e.y"
 { yyval = call(val_peek(2), "subtract", val_peek(0)); }
 break;
 case 60:
-//#line 340 "e.y"
+//#line 344 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 63:
-//#line 345 "e.y"
+//#line 349 "e.y"
 { yyval = call(val_peek(2), "multiply", val_peek(0)); }
 break;
 case 64:
-//#line 346 "e.y"
+//#line 350 "e.y"
 { yyval = call(val_peek(2), "approxDivide", val_peek(0)); }
 break;
 case 65:
-//#line 347 "e.y"
+//#line 351 "e.y"
 { yyval = call(val_peek(2), "floorDivide", val_peek(0)); }
 break;
 case 66:
-//#line 348 "e.y"
+//#line 352 "e.y"
 { yyval = call(val_peek(2), "remainder", val_peek(0)); }
 break;
 case 67:
-//#line 349 "e.y"
+//#line 353 "e.y"
 { yyval = mod(val_peek(2), val_peek(0)); }
 break;
 case 68:
-//#line 357 "e.y"
+//#line 361 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 71:
-//#line 362 "e.y"
+//#line 366 "e.y"
 { yyval = call(val_peek(2), "pow", val_peek(0)); }
 break;
 case 72:
-//#line 371 "e.y"
+//#line 375 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 75:
-//#line 376 "e.y"
+//#line 380 "e.y"
 { yyval = call(val_peek(0), "not", list()); }
 break;
 case 76:
-//#line 377 "e.y"
+//#line 381 "e.y"
 { yyval = call(val_peek(0), "complement", list());}
 break;
 case 77:
-//#line 378 "e.y"
+//#line 382 "e.y"
 { yyval = call(val_peek(0), "negate", list()); }
 break;
 case 78:
-//#line 379 "e.y"
+//#line 383 "e.y"
 { yyval = slotExpr(val_peek(0)); }
 break;
 case 81:
-//#line 391 "e.y"
+//#line 395 "e.y"
 { yyval = call(val_peek(3), "get", val_peek(1)); }
 break;
 case 82:
-//#line 392 "e.y"
+//#line 396 "e.y"
 { yyval = send(val_peek(3), val_peek(1), val_peek(0)); }
 break;
 case 83:
-//#line 393 "e.y"
+//#line 397 "e.y"
 { yyval = send(val_peek(2), "run", val_peek(0)); }
 break;
 case 84:
-//#line 395 "e.y"
+//#line 399 "e.y"
 { pocket("no-paren-call");
                                           yyval = send(val_peek(2), val_peek(0), list()); }
 break;
 case 85:
-//#line 397 "e.y"
+//#line 401 "e.y"
 { pocket("no-paren-call");
                                           yyval = call(val_peek(1), val_peek(0), list()); }
 break;
 case 86:
-//#line 399 "e.y"
+//#line 403 "e.y"
 { pocket("dot-props");
                                           yyval = property(val_peek(2), val_peek(0), list()); }
 break;
 case 87:
-//#line 401 "e.y"
+//#line 405 "e.y"
 { pocket("dot-props");
                                           yyval = property(val_peek(3), val_peek(1), val_peek(0)); }
 break;
 case 88:
-//#line 409 "e.y"
+//#line 413 "e.y"
 { yyval = doMeta(val_peek(1), "run", val_peek(0)); }
 break;
 case 89:
-//#line 410 "e.y"
+//#line 414 "e.y"
 { yyval = doMeta(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 90:
-//#line 411 "e.y"
+//#line 415 "e.y"
 { yyval = doMetaSend(val_peek(2), "run", val_peek(0)); }
 break;
 case 91:
-//#line 412 "e.y"
+//#line 416 "e.y"
 { yyval = doMetaSend(val_peek(3), val_peek(1), val_peek(0)); }
 break;
 case 92:
-//#line 414 "e.y"
+//#line 418 "e.y"
 { pocket("no-paren-call");
                                           yyval = doMeta(val_peek(1), val_peek(0), list()); }
 break;
 case 93:
-//#line 416 "e.y"
+//#line 420 "e.y"
 { pocket("no-paren-call");
                                           yyval = doMetaSend(val_peek(2), val_peek(0), list()); }
 break;
 case 95:
-//#line 430 "e.y"
+//#line 434 "e.y"
 { yyval = call(val_peek(1), "run", val_peek(0)); }
 break;
 case 96:
-//#line 431 "e.y"
+//#line 435 "e.y"
 { yyval = call(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 97:
-//#line 439 "e.y"
+//#line 443 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 98:
-//#line 440 "e.y"
+//#line 444 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 99:
-//#line 441 "e.y"
+//#line 445 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 100:
-//#line 442 "e.y"
+//#line 446 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 101:
-//#line 443 "e.y"
+//#line 447 "e.y"
 { yyval = literal(val_peek(0)); }
 break;
 case 103:
-//#line 447 "e.y"
+//#line 451 "e.y"
 { yyval = uriExpr(val_peek(0)); }
 break;
 case 104:
-//#line 448 "e.y"
+//#line 452 "e.y"
 { yyval = uriExpr(val_peek(2),val_peek(1)); }
 break;
 case 105:
-//#line 450 "e.y"
+//#line 454 "e.y"
 { yyval = quasiExpr(val_peek(1),val_peek(0)); }
 break;
 case 107:
-//#line 453 "e.y"
+//#line 457 "e.y"
 { yyval = tuple(val_peek(1)); }
 break;
 case 108:
-//#line 454 "e.y"
+//#line 458 "e.y"
 { yyval = map(val_peek(1)); }
 break;
 case 109:
-//#line 456 "e.y"
+//#line 460 "e.y"
 { yyval = hide(val_peek(0)); }
 break;
 case 110:
-//#line 458 "e.y"
+//#line 462 "e.y"
 { yyval = escape(val_peek(1),val_peek(0)); }
 break;
 case 111:
-//#line 460 "e.y"
+//#line 464 "e.y"
 { yyval = whilex(val_peek(1),val_peek(0)); }
 break;
 case 112:
-//#line 462 "e.y"
+//#line 466 "e.y"
 { yyval = switchx(val_peek(2),val_peek(1)); }
 break;
 case 113:
-//#line 464 "e.y"
+//#line 468 "e.y"
 { yyval = tryx(val_peek(2),val_peek(1),val_peek(0)); }
 break;
 case 118:
-//#line 472 "e.y"
+//#line 476 "e.y"
 { yyval = quasiLiteralExpr(val_peek(1)); }
 break;
 case 119:
-//#line 473 "e.y"
+//#line 477 "e.y"
 { yyval = quasiLiteralExpr(val_peek(0)); }
 break;
 case 120:
-//#line 474 "e.y"
+//#line 478 "e.y"
 { yyval = quasiLiteralExpr(); }
 break;
 case 121:
-//#line 475 "e.y"
+//#line 479 "e.y"
 { yyval = quasiPatternExpr(val_peek(1)); }
 break;
 case 122:
-//#line 476 "e.y"
+//#line 480 "e.y"
 { yyval = quasiPatternExpr(val_peek(0)); }
 break;
 case 123:
-//#line 479 "e.y"
+//#line 483 "e.y"
 { reserved("select"); }
 break;
 case 124:
-//#line 480 "e.y"
+//#line 484 "e.y"
 { pocket("typedef");
                                                   yyval = val_peek(0); }
 break;
 case 126:
-//#line 489 "e.y"
+//#line 493 "e.y"
 { yyval = object(val_peek(1), val_peek(0)); }
 break;
 case 127:
-//#line 490 "e.y"
+//#line 494 "e.y"
 { yyval = methObject(val_peek(3),val_peek(1),val_peek(0)); }
 break;
 case 128:
-//#line 491 "e.y"
+//#line 495 "e.y"
 { yyval = thunk(val_peek(0)); }
 break;
 case 129:
-//#line 493 "e.y"
+//#line 497 "e.y"
 { yyval = classExpr(val_peek(1),val_peek(0)); }
 break;
 case 130:
-//#line 495 "e.y"
+//#line 499 "e.y"
 { pocket("anon-lambda");
-                                               yyval = methObject(audits(ignore(),
-                                                                      list()),
-                                                               val_peek(1),
-                                                               val_peek(0)); }
+                                          yyval = methObject(audits(ignore(),
+                                                                 list()),
+                                                          val_peek(1),
+                                                          val_peek(0)); }
 break;
 case 131:
-//#line 500 "e.y"
+//#line 504 "e.y"
 { pocket("anon-lambda");
-                                                  yyval = thunk(val_peek(0)); }
+                                          yyval = thunk(val_peek(0)); }
 break;
 case 132:
-//#line 508 "e.y"
+//#line 512 "e.y"
 { yyval = noun(val_peek(0)); }
 break;
 case 133:
-//#line 517 "e.y"
+//#line 521 "e.y"
 { yyval = val_peek(1); }
 break;
 case 134:
-//#line 526 "e.y"
+//#line 530 "e.y"
 { yyval = ifx(val_peek(1), val_peek(0)); }
 break;
 case 135:
-//#line 527 "e.y"
+//#line 531 "e.y"
 { yyval = ifx(val_peek(3), val_peek(2), val_peek(0)); }
 break;
 case 136:
-//#line 528 "e.y"
+//#line 532 "e.y"
 { yyval = ifx(val_peek(4), val_peek(3), val_peek(0)); }
 break;
 case 137:
-//#line 536 "e.y"
+//#line 540 "e.y"
 { yyval = forx(val_peek(5),val_peek(3),val_peek(1)); }
 break;
 case 138:
-//#line 544 "e.y"
+//#line 548 "e.y"
 { yyval = when(val_peek(3),val_peek(2),val_peek(1),val_peek(0)); }
 break;
 case 139:
-//#line 554 "e.y"
+//#line 558 "e.y"
 { yyval = macro(val_peek(4), val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 140:
-//#line 556 "e.y"
+//#line 560 "e.y"
 { yyval = macro(val_peek(5), val_peek(3), val_peek(2), val_peek(0)); }
 break;
 case 141:
-//#line 560 "e.y"
+//#line 564 "e.y"
 { yyval = null; }
 break;
 case 142:
-//#line 562 "e.y"
+//#line 566 "e.y"
 { yyval = macro(val_peek(5), val_peek(3), val_peek(2), val_peek(1)); }
 break;
 case 143:
-//#line 564 "e.y"
+//#line 568 "e.y"
 { yyval = macro(val_peek(5), val_peek(3), val_peek(2), val_peek(0)); }
 break;
 case 144:
-//#line 572 "e.y"
+//#line 576 "e.y"
 { yyval = null; }
 break;
 case 147:
-//#line 579 "e.y"
+//#line 583 "e.y"
 { yyval = noun("simple__quasiParser"); }
 break;
 case 148:
-//#line 580 "e.y"
+//#line 584 "e.y"
 { yyval = noun(val_peek(0) +  "__quasiParser"); }
 break;
 case 149:
-//#line 581 "e.y"
+//#line 585 "e.y"
 { yyval = val_peek(1); }
 break;
 case 150:
-//#line 585 "e.y"
+//#line 589 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 151:
-//#line 586 "e.y"
+//#line 590 "e.y"
 { yyval = with(val_peek(1), val_peek(0)); }
 break;
 case 152:
-//#line 590 "e.y"
+//#line 594 "e.y"
 { yyval = list(val_peek(1), val_peek(0)); }
 break;
 case 153:
-//#line 591 "e.y"
+//#line 595 "e.y"
 { yyval = with(with(val_peek(2), val_peek(1)), val_peek(0)); }
 break;
 case 154:
-//#line 595 "e.y"
-{ yyval = noun(val_peek(0)); }
+//#line 599 "e.y"
+{ yyval = dollarNoun(val_peek(0)); }
 break;
 case 155:
-//#line 596 "e.y"
-{ yyval = val_peek(2); }
-break;
-case 156:
 //#line 600 "e.y"
-{ myLexer.quasiAgain(); }
+{ yyval = val_peek(1); }
 break;
-case 159:
-//#line 617 "e.y"
+case 158:
+//#line 618 "e.y"
 { yyval = list(val_peek(0)); }
 break;
-case 160:
-//#line 618 "e.y"
+case 159:
+//#line 619 "e.y"
 { yyval = with(val_peek(3), val_peek(0)); }
 break;
-case 162:
-//#line 628 "e.y"
+case 161:
+//#line 629 "e.y"
 { yyval = list(val_peek(0)); }
 break;
-case 163:
-//#line 629 "e.y"
+case 162:
+//#line 630 "e.y"
 { yyval = with(val_peek(3), val_peek(0)); }
 break;
-case 164:
-//#line 636 "e.y"
+case 163:
+//#line 637 "e.y"
 { yyval = new Assoc(ignore(), val_peek(0)); }
 break;
-case 166:
-//#line 641 "e.y"
+case 165:
+//#line 642 "e.y"
 { yyval = new Assoc(val_peek(2), val_peek(0)); }
 break;
-case 167:
-//#line 642 "e.y"
+case 166:
+//#line 643 "e.y"
 { reserved("var-extract-pattern"); }
 break;
-case 169:
-//#line 647 "e.y"
+case 168:
+//#line 648 "e.y"
 { yyval = suchThat(val_peek(2), val_peek(0)); }
 break;
-case 170:
-//#line 649 "e.y"
+case 169:
+//#line 650 "e.y"
 { reserved("meta pattern"); }
 break;
-case 172:
-//#line 654 "e.y"
+case 171:
+//#line 655 "e.y"
 { yyval = listPattern(val_peek(1)); }
 break;
-case 173:
-//#line 655 "e.y"
+case 172:
+//#line 656 "e.y"
 { yyval = cdrPattern(val_peek(3), val_peek(0)); }
 break;
-case 174:
-//#line 657 "e.y"
+case 173:
+//#line 658 "e.y"
 { reserved("map pattern"); }
 break;
-case 175:
-//#line 658 "e.y"
+case 174:
+//#line 659 "e.y"
 { reserved("map pattern"); }
 break;
-case 177:
-//#line 663 "e.y"
+case 176:
+//#line 664 "e.y"
 { yyval = patternEquals(val_peek(0)); }
 break;
-case 179:
-//#line 668 "e.y"
+case 178:
+//#line 669 "e.y"
 { yyval = quasiPattern(val_peek(1), val_peek(0)); }
 break;
-case 180:
-//#line 672 "e.y"
+case 179:
+//#line 673 "e.y"
 { yyval = list(val_peek(0)); }
 break;
-case 181:
-//#line 673 "e.y"
+case 180:
+//#line 674 "e.y"
 { yyval = with(val_peek(1), val_peek(0)); }
 break;
-case 182:
-//#line 677 "e.y"
-{ yyval = list(val_peek(1), val_peek(0)); }
-break;
-case 183:
+case 181:
 //#line 678 "e.y"
-{ yyval = with(with(val_peek(2), val_peek(1)), val_peek(0)); }
+{ yyval = list(val_peek(1), val_peek(0)); }
 break;
-case 186:
-//#line 687 "e.y"
-{ yyval = finalPattern(val_peek(0)); }
+case 182:
+//#line 679 "e.y"
+{ yyval = with(with(val_peek(2), val_peek(1)), val_peek(0));}
 break;
-case 187:
+case 185:
 //#line 688 "e.y"
-{ yyval = ignore(); }
+{ yyval = atNoun(val_peek(0)); }
 break;
-case 188:
+case 186:
 //#line 689 "e.y"
-{ yyval = val_peek(2); }
+{ yyval = val_peek(1); }
 break;
-case 189:
+case 187:
 //#line 702 "e.y"
 { yyval = finalPattern(val_peek(2), val_peek(0)); }
 break;
-case 190:
+case 188:
 //#line 703 "e.y"
 { yyval = finalPattern(val_peek(0)); }
 break;
-case 191:
+case 189:
 //#line 704 "e.y"
 { yyval = slotDefiner(val_peek(0)); }
 break;
-case 192:
+case 190:
 //#line 705 "e.y"
 { yyval = ignore(); }
 break;
-case 195:
-//#line 709 "e.y"
-{ yyval = quasiLiteralPatt(val_peek(1)); }
+case 191:
+//#line 706 "e.y"
+{ reserved("anon guard"); }
 break;
-case 196:
+case 194:
 //#line 710 "e.y"
+{ yyval = quasiLiteralPatt(val_peek(1)); }
+break;
+case 195:
+//#line 711 "e.y"
 { yyval = quasiPatternPatt(val_peek(1)); }
 break;
-case 197:
-//#line 714 "e.y"
+case 196:
+//#line 715 "e.y"
 { yyval = bindDefiner(val_peek(2), val_peek(0)); }
 break;
-case 198:
-//#line 715 "e.y"
+case 197:
+//#line 716 "e.y"
 { yyval = bindDefiner(val_peek(0)); }
 break;
-case 199:
-//#line 719 "e.y"
+case 198:
+//#line 720 "e.y"
 { yyval = varPattern(val_peek(2), val_peek(0)); }
 break;
-case 200:
-//#line 720 "e.y"
+case 199:
+//#line 721 "e.y"
 { yyval = varPattern(val_peek(0)); }
 break;
-case 201:
-//#line 729 "e.y"
+case 200:
+//#line 730 "e.y"
 { yyval = finalPattern(val_peek(0)); }
 break;
-case 202:
-//#line 730 "e.y"
+case 201:
+//#line 731 "e.y"
 { yyval = ignore(); }
 break;
-case 203:
-//#line 731 "e.y"
+case 202:
+//#line 732 "e.y"
 { yyval = bindDefiner(val_peek(0)); }
 break;
-case 204:
-//#line 732 "e.y"
+case 203:
+//#line 733 "e.y"
 { yyval = varPattern(val_peek(0)); }
 break;
-case 205:
-//#line 733 "e.y"
+case 204:
+//#line 734 "e.y"
 { yyval = quasiLiteralPatt(val_peek(1)); }
 break;
-case 206:
-//#line 734 "e.y"
+case 205:
+//#line 735 "e.y"
 { yyval = quasiPatternPatt(val_peek(1)); }
 break;
-case 208:
-//#line 751 "e.y"
+case 207:
+//#line 752 "e.y"
 { yyval = val_peek(0); }
 break;
-case 209:
-//#line 752 "e.y"
+case 208:
+//#line 753 "e.y"
 { yyval = bindDefiner(val_peek(0)); }
 break;
-case 210:
-//#line 753 "e.y"
+case 209:
+//#line 754 "e.y"
 { yyval = varPattern(val_peek(0)); }
 break;
-case 211:
-//#line 760 "e.y"
+case 210:
+//#line 761 "e.y"
 { yyval = audits(val_peek(0), list()); }
 break;
-case 212:
-//#line 761 "e.y"
+case 211:
+//#line 762 "e.y"
 { pocket("auditors");
                                                   yyval = audits(val_peek(2), val_peek(0)); }
 break;
-case 213:
-//#line 769 "e.y"
+case 212:
+//#line 770 "e.y"
 { yyval = audits(val_peek(0), list()); }
 break;
-case 214:
-//#line 770 "e.y"
+case 213:
+//#line 771 "e.y"
 { pocket("auditors");
                                                   yyval = audits(val_peek(2), val_peek(0)); }
 break;
-case 215:
-//#line 775 "e.y"
+case 214:
+//#line 776 "e.y"
 { yyval = list(val_peek(0)); }
 break;
-case 216:
-//#line 776 "e.y"
+case 215:
+//#line 777 "e.y"
 { yyval = with(val_peek(3), val_peek(0)); }
 break;
-case 217:
-//#line 788 "e.y"
+case 216:
+//#line 789 "e.y"
 { yyval = list(); }
 break;
-case 218:
-//#line 789 "e.y"
+case 217:
+//#line 790 "e.y"
 { yyval = append(list(val_peek(3)),val_peek(1)); }
 break;
-case 221:
-//#line 803 "e.y"
+case 220:
+//#line 804 "e.y"
 { yyval = method(val_peek(1), val_peek(0)); }
 break;
-case 222:
-//#line 805 "e.y"
+case 221:
+//#line 806 "e.y"
 { reserved("fields"); }
 break;
-case 223:
-//#line 806 "e.y"
+case 222:
+//#line 807 "e.y"
 { reserved("on event"); }
 break;
-case 224:
-//#line 807 "e.y"
+case 223:
+//#line 808 "e.y"
 { reserved("sealed meta"); }
 break;
-case 225:
-//#line 808 "e.y"
+case 224:
+//#line 809 "e.y"
 { reserved("sealed meta"); }
 break;
-case 226:
-//#line 816 "e.y"
+case 225:
+//#line 817 "e.y"
 { yyval = methHead("run", val_peek(2), val_peek(0)); }
 break;
-case 227:
-//#line 817 "e.y"
+case 226:
+//#line 818 "e.y"
 { yyval = methHead(val_peek(4), val_peek(2), val_peek(0)); }
 break;
-case 228:
-//#line 819 "e.y"
+case 227:
+//#line 820 "e.y"
 { pocket("no-paren-method");
                                                yyval = methHead(val_peek(1), list(), val_peek(0)); }
 break;
-case 229:
-//#line 828 "e.y"
+case 228:
+//#line 829 "e.y"
 { yyval = methHead("run", val_peek(2), val_peek(0)); }
 break;
-case 230:
-//#line 830 "e.y"
+case 229:
+//#line 831 "e.y"
 { pocket("one-method-object");
                                                yyval = methHead(val_peek(4), val_peek(2), val_peek(0)); }
 break;
-case 231:
-//#line 832 "e.y"
+case 230:
+//#line 833 "e.y"
 { pocket("no-paren-method");
                                                yyval = methHead(val_peek(1), list(), val_peek(0)); }
 break;
-case 232:
-//#line 841 "e.y"
+case 231:
+//#line 842 "e.y"
 { yyval = list(val_peek(5), val_peek(2), val_peek(0)); }
 break;
-case 233:
-//#line 851 "e.y"
+case 232:
+//#line 852 "e.y"
 { yyval = matcher(val_peek(1), val_peek(0)); }
 break;
-case 234:
-//#line 860 "e.y"
+case 233:
+//#line 861 "e.y"
 { yyval = delegatex(val_peek(0)); }
 break;
-case 235:
-//#line 867 "e.y"
+case 234:
+//#line 868 "e.y"
 { yyval = VOID; }
 break;
-case 236:
-//#line 868 "e.y"
+case 235:
+//#line 869 "e.y"
 { yyval = val_peek(0); }
 break;
-case 237:
-//#line 872 "e.y"
+case 236:
+//#line 873 "e.y"
 { yyval = val_peek(1); }
 break;
-case 238:
-//#line 881 "e.y"
+case 237:
+//#line 882 "e.y"
 { yyval = list(val_peek(7), val_peek(5), val_peek(2), val_peek(0)); }
 break;
-case 239:
-//#line 884 "e.y"
+case 238:
+//#line 885 "e.y"
 { pocket("when-clauses");
                                                   yyval = list(val_peek(5), val_peek(2), val_peek(0)); }
 break;
-case 240:
-//#line 889 "e.y"
+case 239:
+//#line 890 "e.y"
 { yyval = list(val_peek(0)); }
 break;
-case 241:
-//#line 890 "e.y"
+case 240:
+//#line 891 "e.y"
 { yyval = with(val_peek(2), val_peek(0)); }
 break;
-case 242:
-//#line 894 "e.y"
+case 241:
+//#line 895 "e.y"
 { list(val_peek(2), val_peek(0)); }
 break;
-case 247:
-//#line 912 "e.y"
+case 246:
+//#line 913 "e.y"
 { yyval = list(); }
 break;
-case 248:
-//#line 916 "e.y"
+case 247:
+//#line 917 "e.y"
 { yyval = list(); }
 break;
-case 249:
-//#line 921 "e.y"
+case 248:
+//#line 922 "e.y"
 { yyval = val_peek(1); }
 break;
-case 250:
-//#line 926 "e.y"
+case 249:
+//#line 927 "e.y"
 { pocket("lambda-args");
                                           yyval = with(val_peek(1), val_peek(0)); }
 break;
-case 253:
-//#line 936 "e.y"
+case 252:
+//#line 937 "e.y"
 { yyval = list(val_peek(0)); }
 break;
-case 254:
-//#line 937 "e.y"
+case 253:
+//#line 938 "e.y"
 { yyval = with(val_peek(2), val_peek(0)); }
 break;
-case 255:
-//#line 942 "e.y"
+case 254:
+//#line 943 "e.y"
 { yyval = list(val_peek(0)); }
 break;
-case 256:
-//#line 943 "e.y"
+case 255:
+//#line 944 "e.y"
 { yyval = with(val_peek(2), val_peek(0)); }
 break;
-case 257:
-//#line 947 "e.y"
+case 256:
+//#line 948 "e.y"
 { yyval = new Assoc(val_peek(2), val_peek(0)); }
 break;
-case 258:
-//#line 948 "e.y"
+case 257:
+//#line 949 "e.y"
 { reserved("export binding"); }
 break;
-case 260:
-//#line 961 "e.y"
+case 259:
+//#line 964 "e.y"
 { yyval = hilbert(val_peek(0)); }
 break;
+case 260:
+//#line 971 "e.y"
+{ yyval = ((Identifier)val_peek(0)).getText(); }
+break;
 case 261:
-//#line 962 "e.y"
+//#line 972 "e.y"
 { reserved("keyword \"" +
-                                                   ((Token)val_peek(0)).token() +
+                                                   ((Token)val_peek(0)).getText() +
                                                    "\""); }
 break;
 case 262:
-//#line 978 "e.y"
+//#line 988 "e.y"
 { yyval = "add"; }
 break;
 case 263:
-//#line 979 "e.y"
+//#line 989 "e.y"
 { yyval = "and"; }
 break;
 case 264:
-//#line 980 "e.y"
+//#line 990 "e.y"
 { yyval = "approxDivide"; }
 break;
 case 265:
-//#line 981 "e.y"
+//#line 991 "e.y"
 { yyval = "floorDivide"; }
 break;
 case 266:
-//#line 982 "e.y"
+//#line 992 "e.y"
 { yyval = "shiftLeft"; }
 break;
 case 267:
-//#line 983 "e.y"
+//#line 993 "e.y"
 { yyval = "remainder"; }
 break;
 case 268:
-//#line 984 "e.y"
+//#line 994 "e.y"
 { yyval = "mod"; }
 break;
 case 269:
-//#line 985 "e.y"
+//#line 995 "e.y"
 { yyval = "multiply"; }
 break;
 case 270:
-//#line 986 "e.y"
+//#line 996 "e.y"
 { yyval = "or"; }
 break;
 case 271:
-//#line 987 "e.y"
+//#line 997 "e.y"
 { yyval = "pow"; }
 break;
 case 272:
-//#line 988 "e.y"
+//#line 998 "e.y"
 { yyval = "subtract"; }
 break;
 case 273:
-//#line 989 "e.y"
+//#line 999 "e.y"
 { yyval = "xor"; }
 break;
 case 274:
-//#line 998 "e.y"
+//#line 1008 "e.y"
 { yyval = NULL; }
 break;
 case 275:
-//#line 999 "e.y"
+//#line 1009 "e.y"
 { yyval = val_peek(3); }
 break;
 case 276:
-//#line 1003 "e.y"
+//#line 1013 "e.y"
 { yyval = val_peek(1); }
 break;
 case 277:
-//#line 1008 "e.y"
+//#line 1018 "e.y"
 { yyval = eScript(val_peek(2), optMatcher(val_peek(1))); }
 break;
 case 278:
-//#line 1010 "e.y"
+//#line 1020 "e.y"
 { pocket("plumbing");
                                   yyval = eScript(null, val_peek(0)); }
 break;
 case 279:
-//#line 1012 "e.y"
+//#line 1022 "e.y"
 { pocket("plumbing");
                                   yyval = eScript(null, val_peek(0)); }
 break;
 case 281:
-//#line 1022 "e.y"
+//#line 1032 "e.y"
 { yyval = with(val_peek(2), val_peek(1)); }
 break;
 case 283:
-//#line 1027 "e.y"
+//#line 1037 "e.y"
 { yyval = with(val_peek(2), val_peek(1)); }
 break;
 case 285:
-//#line 1032 "e.y"
+//#line 1042 "e.y"
 { yyval = with(val_peek(2), val_peek(1)); }
 break;
 case 288:
-//#line 1049 "e.y"
+//#line 1059 "e.y"
 { yyval = with(val_peek(1), val_peek(0)); }
 break;
 case 289:
-//#line 1053 "e.y"
+//#line 1063 "e.y"
 { yyval = matcher(val_peek(1), val_peek(0)); }
 break;
 case 290:
-//#line 1060 "e.y"
+//#line 1070 "e.y"
 { yyval = null; }
 break;
 case 291:
-//#line 1061 "e.y"
+//#line 1071 "e.y"
 { yyval = val_peek(0); }
 break;
 case 292:
-//#line 1072 "e.y"
+//#line 1082 "e.y"
 { yyval = oType(val_peek(4), val_peek(1)); }
 break;
 case 293:
-//#line 1073 "e.y"
+//#line 1083 "e.y"
 { yyval = oType(val_peek(2), list(val_peek(1))); }
 break;
 case 297:
-//#line 1080 "e.y"
+//#line 1090 "e.y"
 { yyval = with(val_peek(3),val_peek(1)); }
 break;
 case 298:
-//#line 1084 "e.y"
+//#line 1094 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 299:
-//#line 1085 "e.y"
+//#line 1095 "e.y"
 { yyval = with(val_peek(3),val_peek(0)); }
 break;
 case 300:
-//#line 1087 "e.y"
+//#line 1097 "e.y"
 { reserved("on event"); }
 break;
 case 301:
-//#line 1088 "e.y"
+//#line 1098 "e.y"
 { reserved("on event"); }
 break;
 case 302:
-//#line 1095 "e.y"
+//#line 1105 "e.y"
 { yyval = mType(val_peek(1),list(),val_peek(0)); }
 break;
 case 303:
-//#line 1096 "e.y"
+//#line 1106 "e.y"
 { yyval = mType(val_peek(4),val_peek(2),val_peek(0)); }
 break;
 case 304:
-//#line 1097 "e.y"
+//#line 1107 "e.y"
 { yyval = mType("run",val_peek(2),val_peek(0)); }
 break;
 case 305:
-//#line 1101 "e.y"
+//#line 1111 "e.y"
 { yyval = val_peek(0); }
 break;
 case 306:
-//#line 1102 "e.y"
+//#line 1112 "e.y"
 { yyval = val_peek(1); }
 break;
 case 307:
-//#line 1106 "e.y"
+//#line 1116 "e.y"
 { yyval = list(val_peek(0)); }
 break;
 case 308:
-//#line 1107 "e.y"
+//#line 1117 "e.y"
 { yyval = with(val_peek(3),val_peek(0)); }
 break;
 case 309:
-//#line 1114 "e.y"
+//#line 1124 "e.y"
 { yyval = pType(val_peek(1),val_peek(0)); }
 break;
 case 310:
-//#line 1115 "e.y"
+//#line 1125 "e.y"
 { yyval = pType(null,val_peek(0)); }
 break;
 case 311:
-//#line 1119 "e.y"
+//#line 1129 "e.y"
 { yyval = null; }
 break;
 case 312:
-//#line 1120 "e.y"
+//#line 1130 "e.y"
 { yyval = val_peek(0); }
 break;
 case 315:
-//#line 1136 "e.y"
+//#line 1146 "e.y"
 { begin(); }
 break;
 case 316:
-//#line 1143 "e.y"
+//#line 1153 "e.y"
 { end(); }
 break;
-//#line 6800 "EParser.java"
+//#line 6774 "EParser.java"
 //########## END OF USER-SUPPLIED ACTIONS ##########
     }//switch
     //#### Now let's reduce... ####



1.6       +5 -1      e/src/jsrc/org/erights/e/elang/syntax/HilbertHotel.java

Index: HilbertHotel.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/HilbertHotel.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- HilbertHotel.java	2001/09/06 09:55:46	1.5
+++ HilbertHotel.java	2001/11/01 06:32:25	1.6
@@ -63,7 +63,7 @@
     }
 
     /**
-     * If 'name' ends in "-"<digits>, return the index of "-".  Otherwise,
+     * If 'name' ends in "_"<digits>, return the index of "_".  Otherwise,
      * return -1.  This is the format of a temp name.
      */
     static private int tempSep(String name) {
@@ -72,6 +72,10 @@
             return -1;
         }
         int len = name.length();
+        if (i == len -1) {
+            //ends with "_"
+            return -1;
+        }
         for (int j = i+1; j < len; j++) {
             if (! Character.isDigit(name.charAt(j))) {
                 return -1;



1.4       +9 -0      e/src/jsrc/org/erights/e/elang/syntax/Indenter.java

Index: Indenter.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/Indenter.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Indenter.java	2001/09/07 18:11:41	1.3
+++ Indenter.java	2001/11/01 06:32:25	1.4
@@ -152,6 +152,8 @@
      * @param closerChar As an error check, 'closerChar' must be the closing
      *                   bracket character needed to close the most recent
      *                   unclosed bracket.
+     * @param closer Used by some syntax errors to report where the erronous
+     *               closing text occurs.
      */
     public void pop(char closerChar, Twine closer) {
         if (myTOS <= 0) {
@@ -201,5 +203,12 @@
         } else {
             return myIndentStack[myTOS] -1;
         }
+    }
+
+    /**
+     * Show closing stack
+     */
+    public String toString() {
+        return new String(myCloserStack, 1, myTOS);
     }
 }



1.10      +7 -7      e/src/jsrc/org/erights/e/elang/syntax/Token.java

Index: Token.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/Token.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Token.java	2001/09/04 10:52:18	1.9
+++ Token.java	2001/11/01 06:32:25	1.10
@@ -28,27 +28,27 @@
  */
 public class Token {
 
-    private Twine myTok;
+    private Twine mySource;
     private int myTokenType;
 
-    public Token(Twine tok, int tokenType) {
-        if (tok == null) {
+    public Token(Twine source, int tokenType) {
+        if (source == null) {
             //XXX debugging
             throw new RuntimeException("what gives?");
         }
-        myTok = tok;
+        mySource = source;
         myTokenType = tokenType;
     }
 
     /**
      * Where is the source code this syntactic construct was parsed from?
      */
-    public Twine tok() { return myTok; }
+    public Twine getSource() { return mySource; }
 
     /**
      *
      */
-    public String token() { return myTok.bare(); }
+    public String getText() { return mySource.bare(); }
 
     /**
      *
@@ -60,6 +60,6 @@
      */
     public String toString() {
         return EParser.tokenName(myTokenType) + ": \"" +
-                token() + "\"" + " @ " + myTok.optSourceSpan();
+                getText() + "\"" + " @ " + mySource.optSourceSpan();
     }
 }



1.14      +13 -13    e/src/jsrc/org/erights/e/elang/syntax/URI.java

Index: URI.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/URI.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- URI.java	2001/09/06 09:55:46	1.13
+++ URI.java	2001/11/01 06:32:25	1.14
@@ -60,37 +60,37 @@
     /**
      *
      */
-    private URI(Twine tok, int tokenType) {
-        super(tok, tokenType);
-        String token = tok.bare();
-        int i = token.indexOf(':');
-        if (token.charAt(0) != '<') {
+    private URI(Twine source, int tokenType) {
+        super(source, tokenType);
+        String text = source.bare();
+        int i = text.indexOf(':');
+        if (text.charAt(0) != '<') {
             throw new Error("internal: URI must begin with a '<'");
         }
         if (i == -1) {
             throw new Error("internal: URI must have a ':'");
         }
-        myProtocol = token.substring(1, i);
-        int lasti = token.length() -1;
+        myProtocol = text.substring(1, i);
+        int lasti = text.length() -1;
         if (tokenType == EParser.URIStart) {
             if (i != lasti) {
                 throw new Error("internal: URIStart must end with a ':'");
             }
             myOptBody = null;
         } else {
-            if (token.charAt(lasti) != '>') {
+            if (text.charAt(lasti) != '>') {
                 throw new Error("internal: URI must end with a '>'");
             }
-            myOptBody = token.substring(i + 1, lasti);
+            myOptBody = text.substring(i + 1, lasti);
         }
     }
 
     /**
      *
      */
-    static public URI make(Twine tok, int tokenType) {
-        tok = tok.replaceAll("\\","/").replaceAll("|",":");
-        return new URI(tok, tokenType);
+    static public URI make(Twine source, int tokenType) {
+        source = source.replaceAll("\\","/").replaceAll("|",":");
+        return new URI(source, tokenType);
     }
 
     /**
@@ -143,7 +143,7 @@
      * @see org.erights.e.elang.syntax.URI#protocol
      * @see org.erights.e.elang.syntax.URI#body
      */
-    public String token() {
+    public String getText() {
         if (null == myOptBody) {
             return "<" + myProtocol + ":";
         } else {



1.87      +91 -77    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.86
retrieving revision 1.87
diff -u -r1.86 -r1.87
--- e.y	2001/10/27 17:27:43	1.86
+++ e.y	2001/11/01 06:32:25	1.87
@@ -47,22 +47,26 @@
 %}
 
 /* Categorical terminals */
-%token LiteralInteger /* precision unlimited */
-%token LiteralFloat64
-%token LiteralChar
-%token LiteralString
-%token LiteralTwine
-
-%token Identifier
-%token VerbAss
-%token QuasiOpen
-%token QuasiClose
-%token URI
-%token URIStart
-%token BodyStartWord
-%token BodyNextWord
-%token VTableStartWord
-%token VTableNextWord
+%token LiteralInteger   /* precision unlimited */
+%token LiteralFloat64   /* IEEE double precision */
+%token LiteralChar      /* Unicode */
+%token LiteralString    /* Double quoted */
+%token LiteralTwine     /* quasi-quoted without holes.  Not yet used */
+
+%token Identifier       /* like Java, but no "$"s, and not "_" or keyword */
+%token VerbAss          /* Identifier "=" */
+%token QuasiOpen        /* ("`" char*) | (char*), up to hole */
+%token QuasiClose       /* QuasiOpen "`" */
+%token DollarIdent      /* "$" Identifier */
+%token AtIdent          /* ("@" Identifier) | "@_" */
+%token DollarOpen       /* "${" */
+%token AtOpen           /* "@{" */
+%token URI              /* "<" protocol ":" body ">" */
+%token URIStart         /* "<" protocol ":" */
+%token BodyStartWord    /* defmacro'd keyword.  Not yet used */
+%token BodyNextWord     /* defmacro'd keyword.  Not yet used */
+%token VTableStartWord  /* defmacro'd keyword.  Not yet used */
+%token VTableNextWord   /* defmacro'd keyword.  Not yet used */
 
 /* Keywords */
 %token BIND CATCH CLASS DEF DELEGATE
@@ -203,14 +207,14 @@
  ;
 
 /**
- * "def <ident>" without a right hand side is a forward declaration.
+ * "def <noun>" without a right hand side is a forward declaration.
  * It introduces the name into scope bound to a promise for what it
  * will be.
  */
 assigns:
         assign
  |      assigns ';' assign              { $$ = sequence($1, $3); }
- |      define ident                    { $$ = forward($2); }
+ |      define noun                     { $$ = forward($2); }
  ;
 
 
@@ -376,7 +380,7 @@
  |      '!' prim                { $$ = call($2, "not", list()); }
  |      '~' prim                { $$ = call($2, "complement", list());}
  |      '-' prim                { $$ = call($2, "negate", list()); }
- |      '&' ident               { $$ = slotExpr($2); }
+ |      '&' noun                { $$ = slotExpr($2); }
  ;
 
 
@@ -442,7 +446,7 @@
  |      LiteralString                           { $$ = literal($1); }
  |      LiteralTwine                            { $$ = literal($1); }
 
- |      noun
+ |      nounExpr
 
  |      URI                                     { $$ = uriExpr($1); }
  |      URIStart add '>'                        { $$ = uriExpr($1,$2); }
@@ -469,10 +473,10 @@
 
  |      macro
 
- |      '$' '{' LiteralInteger '}'              { $$ = quasiLiteralExpr($3); }
+ |      DollarOpen LiteralInteger '}'           { $$ = quasiLiteralExpr($2); }
  |      '$' LiteralInteger                      { $$ = quasiLiteralExpr($2); }
  |      '$' '$'                                 { $$ = quasiLiteralExpr(); }
- |      '@' '{' LiteralInteger '}'              { $$ = quasiPatternExpr($3); }
+ |      AtOpen LiteralInteger '}'               { $$ = quasiPatternExpr($2); }
  |      '@' LiteralInteger                      { $$ = quasiPatternExpr($2); }
 
 
@@ -486,26 +490,26 @@
  * Note that 'classHead' provides its own 'begin'
  */
 object:
-        defAudits vTable                        { $$ = object($1, $2); }
- |      defAudits begin funcHead body           { $$ = methObject($1,$3,$4); }
- |      begin THUNK body                        { $$ = thunk($3); }
-
- |      CLASS classHead body                    { $$ = classExpr($2,$3); }
-
- |      begin '_' funcHead body              { pocket("anon-lambda");
-                                               $$ = methObject(audits(ignore(),
-                                                                      list()),
-                                                               $3,
-                                                               $4); }
- |      begin '_' body                          { pocket("anon-lambda");
-                                                  $$ = thunk($3); }
+        defAudits vTable                { $$ = object($1, $2); }
+ |      defAudits begin funcHead body   { $$ = methObject($1,$3,$4); }
+ |      begin THUNK body                { $$ = thunk($3); }
+
+ |      CLASS classHead body            { $$ = classExpr($2,$3); }
+
+ |      begin '_' funcHead body         { pocket("anon-lambda");
+                                          $$ = methObject(audits(ignore(),
+                                                                 list()),
+                                                          $3,
+                                                          $4); }
+ |      begin '_' body                  { pocket("anon-lambda");
+                                          $$ = thunk($3); }
  ;
 
 /**
  * Evaluates to the binding of this name in the current scope
  */
-noun:
-        ident                                   { $$ = noun($1); }
+nounExpr:
+        noun                                   { $$ = noun($1); }
  ;
 
 
@@ -592,13 +596,10 @@
  ;
 
 innerExpr:
-        '$' quasiAgain ident            { $$ = noun($3); }
- |      '$' '{' eExpr quasiAgain '}'    { $$ = $3; }
+        DollarIdent                     { $$ = dollarNoun($1); }
+ |      DollarOpen eExpr '}'            { $$ = $2; }
  ;
 
-quasiAgain:
-        /* empty */                     { myLexer.quasiAgain(); }
- ;
 
 /**
 ********************************************
@@ -669,13 +670,13 @@
  ;
 
 quasiPattern:
-        QuasiClose                      { $$ = list($1); }
- |      innerThings QuasiClose          { $$ = with($1, $2); }
+        QuasiClose                              { $$ = list($1); }
+ |      innerThings QuasiClose                  { $$ = with($1, $2); }
  ;
 
 innerThings:
-        QuasiOpen innerThing            { $$ = list($1, $2); }
- |      innerThings QuasiOpen innerThing { $$ = with(with($1, $2), $3); }
+        QuasiOpen innerThing                    { $$ = list($1, $2); }
+ |      innerThings QuasiOpen innerThing        { $$ = with(with($1, $2), $3);}
  ;
 
 innerThing:
@@ -684,40 +685,40 @@
  ;
 
 innerPattern:
-        '@' quasiAgain ident            { $$ = finalPattern($3); }
- |      '@' quasiAgain '_'              { $$ = ignore(); }
- |      '@' '{' pattern quasiAgain '}'  { $$ = $3; }
+        AtIdent                                 { $$ = atNoun($1); }
+ |      AtOpen pattern '}'                      { $$ = $2; }
  ;
 
 
 /**
  * Namers are patterns that bind at most one name.
- * The 'ident' forms are the only defining lambda occurance of a
+ * The 'noun' forms are the only defining lambda occurance of a
  * variable name.
  *
  * Wherever a namer is needed, a "_" can be used to match anything
  * and suppress binding a name.
  */
 namer:
-        ident ':' order                 { $$ = finalPattern($1, $3); }
- |      ident                           { $$ = finalPattern($1); }
- |      '&' ident                       { $$ = slotDefiner($2); }
+        noun ':' order                  { $$ = finalPattern($1, $3); }
+ |      noun                            { $$ = finalPattern($1); }
+ |      '&' noun                        { $$ = slotDefiner($2); }
  |      '_'                             { $$ = ignore(); }
+ |      '_' ':' order                   { reserved("anon guard"); }
  |      binder
  |      varNamer
 
- |      '$' '{' LiteralInteger '}'      { $$ = quasiLiteralPatt($3); }
- |      '@' '{' LiteralInteger '}'      { $$ = quasiPatternPatt($3); }
+ |      DollarOpen LiteralInteger '}'   { $$ = quasiLiteralPatt($2); }
+ |      AtOpen LiteralInteger '}'       { $$ = quasiPatternPatt($2); }
  ;
 
 binder:
-        BIND ident ':' order            { $$ = bindDefiner($2, $4); }
- |      BIND ident                      { $$ = bindDefiner($2); }
+        BIND noun ':' order             { $$ = bindDefiner($2, $4); }
+ |      BIND noun                       { $$ = bindDefiner($2); }
  ;
 
 varNamer:
-        VAR ident ':' order             { $$ = varPattern($2, $4); }
- |      VAR ident                       { $$ = varPattern($2); }
+        VAR noun ':' order              { $$ = varPattern($2, $4); }
+ |      VAR noun                        { $$ = varPattern($2); }
  ;
 
 
@@ -726,12 +727,12 @@
  * expression 
  */
 oName:
-        ident                           { $$ = finalPattern($1); }
+        noun                            { $$ = finalPattern($1); }
  |      '_'                             { $$ = ignore(); }
- |      BIND ident                      { $$ = bindDefiner($2); }
- |      VAR ident                       { $$ = varPattern($2); }
- |      '$' '{' LiteralInteger '}'      { $$ = quasiLiteralPatt($3); }
- |      '@' '{' LiteralInteger '}'      { $$ = quasiPatternPatt($3); }
+ |      BIND noun                       { $$ = bindDefiner($2); }
+ |      VAR noun                        { $$ = varPattern($2); }
+ |      DollarOpen LiteralInteger '}'   { $$ = quasiLiteralPatt($2); }
+ |      AtOpen LiteralInteger '}'       { $$ = quasiPatternPatt($2); }
  |      litString
  ;
 
@@ -749,8 +750,8 @@
  */
 defName:
         define oName                            { $$ = $2; }
- |      BIND ident                              { $$ = bindDefiner($2); }
- |      VAR ident                               { $$ = varPattern($2); }
+ |      BIND noun                               { $$ = bindDefiner($2); }
+ |      VAR noun                                { $$ = varPattern($2); }
  ;
 
 /**
@@ -758,7 +759,7 @@
  */
 audits:
         oName                                   { $$ = audits($1, list()); }
- |      oName Audit nouns                       { pocket("auditors");
+ |      oName Audit nounExprs                   { pocket("auditors");
                                                   $$ = audits($1, $3); }
  ;
 
@@ -767,13 +768,13 @@
  */
 defAudits:
         defName                                 { $$ = audits($1, list()); }
- |      defName Audit nouns                     { pocket("auditors");
+ |      defName Audit nounExprs                 { pocket("auditors");
                                                   $$ = audits($1, $3); }
  ;
 
-nouns:
-        noun                                    { $$ = list($1); }
- |      nouns ',' br noun                       { $$ = with($1, $4); }
+nounExprs:
+        nounExpr                                { $$ = list($1); }
+ |      nounExprs ',' br nounExpr               { $$ = with($1, $4); }
  ;
 
 
@@ -945,7 +946,7 @@
 
 map:
         eExpr MapsTo eExpr              { $$ = new Assoc($1, $3); }
- |      MapsTo noun                     { reserved("export binding"); }
+ |      MapsTo nounExpr                 { reserved("export binding"); }
  ;
 
 
@@ -956,11 +957,20 @@
         ident
  ;
 
+/**
+ * A variable name
+ */
+noun:
+        ident                           { $$ = hilbert($1); }
+ ;
 
+/**
+ * A non-reserved Identifier (as a String)
+ */
 ident:
-        Identifier                      { $$ = hilbert($1); }
+        Identifier                      { $$ = ((Identifier)$1).getText(); }
  |      reserved                        { reserved("keyword \"" +
-                                                   ((Token)$1).token() +
+                                                   ((Token)$1).getText() +
                                                    "\""); }
  ;
 
@@ -1111,13 +1121,13 @@
  * Parameter type
  */
 pType:
-        ident optType                           { $$ = pType($1,$2); }
+        noun optType                            { $$ = pType($1,$2); }
  |      '_' optType                             { $$ = pType(null,$2); }
  ;
 
 optType:
         /*empty*/                               { $$ = null; }
- |      ':' noun                                { $$ = $2; }
+ |      ':' nounExpr                            { $$ = $2; }
  ;
 
 /**
@@ -1343,7 +1353,7 @@
     } catch (IOException ex) {
         yyerror("io: " + ex);
     }
-    yytext = token.token();
+    yytext = token.getText();
     yylval = token;
     return token.tokenType();
 }
@@ -1413,6 +1423,10 @@
     TheTokens[VerbAss]          = "verb-assign";
     TheTokens[QuasiOpen]        = "quasi-open";
     TheTokens[QuasiClose]       = "quasi-close";
+    TheTokens[DollarIdent]      = "dollar-identifier-hole";
+    TheTokens[AtIdent]          = "at-identifier-hole";
+    TheTokens[DollarOpen]       = "dollar-open-hole";
+    TheTokens[AtOpen]           = "at-open-hole";
     TheTokens[URI]              = "uniform-resource-identifier";
     TheTokens[URIStart]         = "uri-protocol-with-colon";
     TheTokens[BodyStartWord]    = "body-start-word";



1.3       +45 -30    e/src/jsrc/org/quasiliteral/astro/Functor.java

Index: Functor.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/astro/Functor.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Functor.java	2001/10/27 17:27:43	1.2
+++ Functor.java	2001/11/01 06:32:25	1.3
@@ -15,6 +15,21 @@
 import antlr.CommonToken;
 
 /**
+ * Like an Antlr {@link Token}, but with differences that make it suitable
+ * for quasiliteral processing.
+ * <p>
+ * The differences are
+ * <ul>
+ * <li>It knows how to convert to and from an Antlr Token, in a way that
+ *     preserves the semantics of vanilla Tokens.
+ * <li>It's PassByCopy, necessitating it be Immutable.</li>
+ * <li>The token-type is identified by a string instead of a number,
+ *     enabling it to make some sense without reference to a specific
+ *     grammar.</li>
+ * <li>The token-text is a {@link Twine} instead of a string, and can
+ *     therefore remember its source positions.</li>
+ * <li>It has a convenient printed form.</li>
+ * </ul>
  *
  * @author <a href="mailto:markm@caplet.com">Mark S Miller</a>
  * @author Many ideas from Danfuzz Bornstein
@@ -36,7 +51,7 @@
      * @serial The source text corresponding to the original source of the
      *         token.
      */
-    private final Twine myText;
+    private final Twine mySource;
 
     /**
      * @serial An optional value calculated from the source text.
@@ -46,18 +61,18 @@
     /**
      * @param tokenType The name of an Antlr token type int in a particular
      *                  grammar.
-     * @param text The source text corresponding to the original source of
-     *             the token, although it isn't necessarily the same as the
-     *             original source text.  In any case, its source span
-     *             information says what positions in the original source it
-     *             corresponds to. The source position info is not part of
-     *             the normal printed form.
+     * @param source The source text corresponding to the original source of
+     *               the token, although it isn't necessarily the same as the
+     *               original source text.  In any case, its source span
+     *               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.
      */
-    public Functor(String tokenType, Twine text, Object optValue) {
+    public Functor(String tokenType, Twine source, Object optValue) {
         myTokenType = tokenType;
-        myText = text;
+        mySource = source;
         myOptValue = optValue;
     }
 
@@ -69,15 +84,21 @@
                                     ConstList typeNames)
     {
         String tokenType = (String)typeNames.get(token.getType());
-        SourceSpan span = new SourceSpan(url,
-                                         false,
-                                         token.getLine(),
-                                         token.getColumn(),
-                                         token.getLine(),
-                                         token.getColumn());
-        return new Functor(tokenType,
-                           Twine.fromString(token.getText(), span),
-                           null);
+        if (token instanceof MilkToken) {
+            return new Functor(tokenType,
+                               ((MilkToken)token).getSource(),
+                               ((MilkToken)token).getOptValue());
+        } else {
+            SourceSpan span = new SourceSpan(url,
+                                             false,
+                                             token.getLine(),
+                                             token.getColumn(),
+                                             token.getLine(),
+                                             token.getColumn());
+            return new Functor(tokenType,
+                               Twine.fromString(token.getText(), span),
+                               null);
+        }
     }
 
     /**
@@ -85,13 +106,7 @@
      */
     public Token asToken(ConstMap typeNums) {
         int tokenTypeInt = E.asInt(typeNums.get(myTokenType));
-        Token result = new CommonToken(tokenTypeInt, myText.bare());
-        SourceSpan optSpan = myText.optSourceSpan();
-        if (null != optSpan) {
-            result.setLine(optSpan.getStartLine());
-            result.setColumn(optSpan.getStartCol());
-        }
-        return result;
+        return new MilkToken(tokenTypeInt, mySource, myOptValue);
     }
 
     /**
@@ -100,7 +115,7 @@
     public Object[] getCanonicalState() {
         Object[] result = {
             FunctorMaker, "new",
-            myTokenType, myText, myOptValue
+            myTokenType, mySource, myOptValue
         };
         return result;
     }
@@ -115,8 +130,8 @@
     /**
      *
      */
-    public Twine getText() {
-        return myText;
+    public Twine getSource() {
+        return mySource;
     }
 
     /**
@@ -138,9 +153,9 @@
      */
     public String toString(boolean quasiFlag) {
         String result = myTokenType;
-        if (! myTokenType.equals(myText.bare())) {
+        if (! myTokenType.equals(mySource.bare())) {
             result += ":";
-            Twine quoted = myText.quote();
+            Twine quoted = mySource.quote();
             if (quasiFlag) {
                 quoted = quoted.replaceAll("$", "$$");
                 quoted = quoted.replaceAll("@", "@@");