[e-cvs] cvs commit: e/src/jsrc/org/quasiliteral/term Term.java Term.updoc TermBuilder.java TermParser.java term.y

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Mon, 10 Dec 2001 11:55:33 -0500


markm       01/12/10 11:55:33

  Modified:    src/jsrc/org/erights/e/elang/syntax EParser.java e.y
               src/jsrc/org/quasiliteral/astro AstroBuilder.java
                        AstroSchema.java AstroTag.java AstroToken.java
                        BaseBuilder.java BaseSchema.java
               src/jsrc/org/quasiliteral/quasiterm QuasiBuilderAdaptor.java
               src/jsrc/org/quasiliteral/term Term.java Term.updoc
                        TermBuilder.java TermParser.java term.y
  Log:
  TermParser works again.  More invariants enforced.

Revision  Changes    Path
1.111     +33 -4     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.110
retrieving revision 1.111
diff -u -r1.110 -r1.111
--- EParser.java	2001/12/10 06:11:00	1.110
+++ EParser.java	2001/12/10 16:55:32	1.111
@@ -1556,6 +1556,35 @@
     TheTokens[VOLATILE]         = "volatile";
     TheTokens[WSTRING]          = "wstring";
 
+    /* Single-Character Tokens */
+    TheTokens[';']              = "SemiColon";
+    TheTokens['&']              = "Ampersand";
+    TheTokens['|']              = "VerticalBar";
+    TheTokens['^']              = "Caret";
+    TheTokens['+']              = "Plus";
+    TheTokens['-']              = "Minus";
+    TheTokens['*']              = "Star";
+    TheTokens['/']              = "Slash";
+    TheTokens['%']              = "Percent";
+    TheTokens['!']              = "Bang";
+    TheTokens['~']              = "Tilde";
+    TheTokens['$']              = "Dollar";
+    TheTokens['@']              = "At";
+    TheTokens[',']              = "Comma";
+    TheTokens['?']              = "Question";
+    TheTokens[':']              = "Colon";
+    TheTokens['.']              = "Dot";
+
+    TheTokens['(']              = "OpenParen";
+    TheTokens[')']              = "CloseParen";
+    TheTokens['[']              = "OpenBracket";
+    TheTokens[']']              = "CloseBracket";
+    TheTokens['{']              = "OpenBrace";
+    TheTokens['}']              = "CloseBrace";
+    TheTokens['<']              = "OpenAngle";
+    TheTokens['>']              = "CloseAngle";
+
+
     /* Multi-Character Operators */
     TheTokens[OpLAnd]           = "OpLAnd";
     TheTokens[OpLOr]            = "OpLOr";
@@ -1683,7 +1712,7 @@
 static public boolean isContinuer(int tagCode) {
     return TheContinuers[tagCode];
 }
-//#line 5602 "EParser.java"
+//#line 5631 "EParser.java"
 //###############################################################
 // method: yylexdebug : check lexer state
 //###############################################################
@@ -1703,7 +1732,7 @@
 //###############################################################
 // method: yyparse : parse input and execute indicated items
 //###############################################################
-int yyparse()
+int yyparse() 
 {
 int yyn;       //next next thing to do
 int yym;       //
@@ -1719,7 +1748,7 @@
   while (true) //until parsing is done, either correctly, or w/error
     {
     doaction=true;
-    if (yydebug) debug("loop");
+    if (yydebug) debug("loop"); 
     //#### NEXT ACTION (from reduction table)
     for (yyn=yydefred[yystate];yyn==0;yyn=yydefred[yystate])
       {
@@ -2850,7 +2879,7 @@
 //#line 1159 "e.y"
 { end(); }
 break;
-//#line 6766 "EParser.java"
+//#line 6795 "EParser.java"
 //########## END OF USER-SUPPLIED ACTIONS ##########
     }//switch
     //#### Now let's reduce... ####



1.100     +29 -0     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.99
retrieving revision 1.100
diff -u -r1.99 -r1.100
--- e.y	2001/12/10 06:11:01	1.99
+++ e.y	2001/12/10 16:55:32	1.100
@@ -1603,6 +1603,35 @@
     TheTokens[VOLATILE]         = "volatile";
     TheTokens[WSTRING]          = "wstring";
 
+    /* Single-Character Tokens */
+    TheTokens[';']              = "SemiColon";
+    TheTokens['&']              = "Ampersand";
+    TheTokens['|']              = "VerticalBar";
+    TheTokens['^']              = "Caret";
+    TheTokens['+']              = "Plus";
+    TheTokens['-']              = "Minus";
+    TheTokens['*']              = "Star";
+    TheTokens['/']              = "Slash";
+    TheTokens['%']              = "Percent";
+    TheTokens['!']              = "Bang";
+    TheTokens['~']              = "Tilde";
+    TheTokens['$']              = "Dollar";
+    TheTokens['@']              = "At";
+    TheTokens[',']              = "Comma";
+    TheTokens['?']              = "Question";
+    TheTokens[':']              = "Colon";
+    TheTokens['.']              = "Dot";
+
+    TheTokens['(']              = "OpenParen";
+    TheTokens[')']              = "CloseParen";
+    TheTokens['[']              = "OpenBracket";
+    TheTokens[']']              = "CloseBracket";
+    TheTokens['{']              = "OpenBrace";
+    TheTokens['}']              = "CloseBrace";
+    TheTokens['<']              = "OpenAngle";
+    TheTokens['>']              = "CloseAngle";
+
+
     /* Multi-Character Operators */
     TheTokens[OpLAnd]           = "OpLAnd";
     TheTokens[OpLOr]            = "OpLOr";



1.5       +7 -0      e/src/jsrc/org/quasiliteral/astro/AstroBuilder.java

Index: AstroBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/astro/AstroBuilder.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AstroBuilder.java	2001/12/10 06:11:03	1.4
+++ AstroBuilder.java	2001/12/10 16:55:33	1.5
@@ -28,6 +28,13 @@
     AstroSchema getSchema();
 
     /**
+     * Turns a leaf Astro ('token') as produced by the lexer or the leaf
+     * methods below into an Astro suitable for use in other (node and arg)
+     * methods.
+     */
+    Astro functor(Astro token);
+
+    /**
      * Makes a leaf (eg, a Token) not representing literal data, but just a
      * token tag (token type indicator) as identified by 'tag'.
      * <p>



1.9       +2 -1      e/src/jsrc/org/quasiliteral/astro/AstroSchema.java

Index: AstroSchema.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/astro/AstroSchema.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- AstroSchema.java	2001/12/10 06:11:03	1.8
+++ AstroSchema.java	2001/12/10 16:55:33	1.9
@@ -45,7 +45,8 @@
      * <p>
      * If there is no tag defined in this schema for this name, this still
      * returns a (typically newly allocated) tag with this tagName and this
-     * schema, but with a tagCode of -1
+     * schema, but with a tagCode of -1.  Even in this case, the tagName
+     * of the resulting tag will be interned.
      */
     AstroTag obtainTagForName(String tagName);
 



1.6       +4 -0      e/src/jsrc/org/quasiliteral/astro/AstroTag.java

Index: AstroTag.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/astro/AstroTag.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- AstroTag.java	2001/12/10 06:11:03	1.5
+++ AstroTag.java	2001/12/10 16:55:33	1.6
@@ -5,6 +5,7 @@
 import org.erights.e.elib.serial.Persistent;
 import org.erights.e.elib.tables.Twine;
 import org.erights.e.elib.prim.E;
+import org.quasiliteral.syntax.BaseLexer;
 import antlr.Token;
 
 import java.math.BigInteger;
@@ -170,6 +171,9 @@
         myTagName = tagName.intern();
         mySchema = (null == optSchema ? BaseSchema.MINIMAL : optSchema);
         myOptDataType = optPromoteType(optDataType);
+        E.require(BaseLexer.isIdentifierOrKeyword(myTagName),
+                  "Must be identifier: ", myTagName);
+
     }
 
     public String toString() {



1.13      +3 -3      e/src/jsrc/org/quasiliteral/astro/AstroToken.java

Index: AstroToken.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/astro/AstroToken.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- AstroToken.java	2001/12/10 06:11:03	1.12
+++ AstroToken.java	2001/12/10 16:55:33	1.13
@@ -280,9 +280,9 @@
         if (getTag().isTagForData(myOptData)) {
             return ConstList.EmptyList;
         } else {
-            //XXX refactor to avoid allocation
-            AstroBuilder builder = new ASTBuilder(getTag().getSchema());
-            Astro arg = builder.leafData(myOptData, getSource());
+            AstroSchema schema = getTag().getSchema();
+            AstroTag litTag = schema.getTypeTag(myOptData.getClass());
+            Astro arg = new AstroToken(litTag, myOptData, getSource());
             return ConstList.EmptyList.with(arg);
         }
     }



1.2       +7 -0      e/src/jsrc/org/quasiliteral/astro/BaseBuilder.java

Index: BaseBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/astro/BaseBuilder.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- BaseBuilder.java	2001/12/10 06:11:03	1.1
+++ BaseBuilder.java	2001/12/10 16:55:33	1.2
@@ -32,6 +32,13 @@
     }
 
     /**
+     * Defaults to the identity function
+     */
+    public Astro functor(Astro token) {
+        return token;
+    }
+
+    /**
      * Actually makes the kind of leaf this builder makes.
      * <p>
      * This is 'internal*' and 'protected' because it assumes that the



1.9       +1 -0      e/src/jsrc/org/quasiliteral/astro/BaseSchema.java

Index: BaseSchema.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/astro/BaseSchema.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- BaseSchema.java	2001/12/10 06:11:03	1.8
+++ BaseSchema.java	2001/12/10 16:55:33	1.9
@@ -6,6 +6,7 @@
 import org.erights.e.elib.tables.FlexList;
 import org.erights.e.elib.tables.FlexMap;
 import org.erights.e.elib.tables.Twine;
+import org.quasiliteral.syntax.BaseLexer;
 
 import java.math.BigInteger;
 



1.4       +4 -0      e/src/jsrc/org/quasiliteral/quasiterm/QuasiBuilderAdaptor.java

Index: QuasiBuilderAdaptor.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/quasiterm/QuasiBuilderAdaptor.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- QuasiBuilderAdaptor.java	2001/12/10 06:11:03	1.3
+++ QuasiBuilderAdaptor.java	2001/12/10 16:55:33	1.4
@@ -53,6 +53,10 @@
         return myBuilder.getSchema();
     }
 
+    public Astro functor(Astro token) {
+        return myBuilder.functor(token);
+    }
+
     public Astro leafTag(AstroTag tag, Twine source) {
         return myBuilder.leafTag(tag, source);
     }



1.14      +5 -0      e/src/jsrc/org/quasiliteral/term/Term.java

Index: Term.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/Term.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- Term.java	2001/12/10 06:11:03	1.13
+++ Term.java	2001/12/10 16:55:33	1.14
@@ -228,10 +228,12 @@
      * </ul>
      */
     public double compareTo(Term other) {
+        //compare tags first
         double result = myTag.compareTo(other.myTag);
         if (0.0 != result) {
             return result;
         }
+        //then data
         if (null == myOptData) {
             if (null == other.myOptData) {
                 //do nothing
@@ -244,6 +246,8 @@
                 //everything else is greater than null
                 return 1.0;
             } else {
+                //note that we only compare data when tags match, so the
+                //comparison should never give a type mismatch exception
                 result = E.asFloat64(E.call(myOptData,
                                             "compareTo",
                                             other.myOptData));
@@ -252,6 +256,7 @@
         if (0.0 != result) {
             return result;
         }
+        //and finally, the args
         return myArgs.compareTo(other.myArgs);
     }
 



1.14      +30 -50    e/src/jsrc/org/quasiliteral/term/Term.updoc

Index: Term.updoc
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/Term.updoc,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- Term.updoc	2001/12/05 00:46:11	1.13
+++ Term.updoc	2001/12/10 16:55:33	1.14
@@ -1,60 +1,45 @@
-    ? 2 + 3
-    # value: 5
+    ? (def qq__uriGetter := <unsafe:org.quasiliteral.*>
+    >  def astro__uriGetter := <qq:astro.*>
+    >  def term__uriGetter := <qq:term.*>
+    >  def qterm__uriGetter := <qq:quasiterm.*>)
+    # value: <unsafe:org.quasiliteral.quasiterm.*>
     
-    ? def dom := sml`<tag>text</tag>`
+    ? def dom := sml`<tag>text<foo>x</foo>y</tag>`
     # value: sml`<tag>
     #                text
+    #                <foo>
+    #                x
+    #            </foo>
+    #                y
     #            </tag>`
-    
-    ? def qq__uriGetter := <unsafe:org.quasiliteral.*>
-    # value: <unsafe:org.quasiliteral.*>
     
-    ? def miniSchema := <qq:astro.BaseSchema> new("mini", ["tag", "foo", "LiteralString"])
+    ? def miniSchema := <astro:BaseSchema> new("mini", [
+    >     "tag",
+    >     "foo", 
+    >     "LiteralChar",
+    >     "LiteralInteger",
+    >     "LiteralFloat64",
+    >     "LiteralString"])
     # value: <Schema for mini>
-    
-    ? def miniBuilder := <qq:astro.BaseBuilder> new(miniSchema)
-    # value: <building ASTs for mini>
-    
-    ? def ast := dom build(miniBuilder)
-    # value: ["",<0>]
-    
-    ? ast getType()
-    # value: 0
-    
-    ? ast getText()
-    # value: ""
-    
-    ? def token := ast getOptToken()
-    # value: ["",<0>]
-    
-    ? def tag := token getOptTag()
-    # value: <tag:<Schema for mini>>
     
-    ? tag getTypeName()
-    # value: "tag"
-    
-    ? ast getNextSibling()
-    ? def c1 := ast getFirstChild()
-    # value: ["",<2>]
-    
-    ? c1 getType()
-    # value: 2
-    
-    ? def tok1 := c1 getOptToken()
-    # value: ["",<2>]
-    
-    ? tok1 getOptData()
-    # value: "text"
-    
-    ? def miniTermBuilder := <qq:term.TermBuilder> new(miniSchema)
+    ? def miniBuilder := <term:TermBuilder> new(miniSchema)
     # value: <building Term trees for mini>
     
-    ? def term := dom build(miniTermBuilder)
-    # value: term`tag("text")`
+    ? def term := dom build(miniBuilder)
+    # value: term`tag("text",
+    #                 foo("x"),
+    #                 "y")`
+    
+    ? def TermParserMaker := <term:TermParser>
+    # value: <unsafe:org.quasiliteral.term.TermParser>
+    
+    ? def term := TermParserMaker("foo(3, x(3, 'x'), zip)")
+    # value: term`foo(3,
+    #                 x(3, 'x'),
+    #                 zip)`
     
     ? 
     ? 
-    ? 
     ? def t1 := term`"foo"`
     # value: term`"foo"`
     
@@ -77,11 +62,6 @@
     ? 
     ? 
     ? 
-    ? def term__uriGetter := <unsafe:org.quasiliteral.term.*>
-    # value: <unsafe:org.quasiliteral.term.*>
-    
-    ? def qterm__uriGetter := <unsafe:org.quasiliteral.quasiterm.*>
-    # value: <unsafe:org.quasiliteral.quasiterm.*>
     
     ? def term__quasiParser := <qterm:QuasiTermBuilder> THE_ONE()
     # value: <SimpleTermBuilder>



1.14      +17 -0     e/src/jsrc/org/quasiliteral/term/TermBuilder.java

Index: TermBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/TermBuilder.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- TermBuilder.java	2001/12/10 06:11:03	1.13
+++ TermBuilder.java	2001/12/10 16:55:33	1.14
@@ -58,6 +58,23 @@
     }
 
     /**
+     * Transform 'ID(foo)' into 'foo'.
+     * <p>
+     * Otherwise, is an identity function
+     */
+    public Astro functor(Astro token) {
+        if (token.getTag().getTagName() == "ID") {
+            //the above test is valid, since tagNames are guaranteed to be
+            //interned.
+            String name = ((Twine)token.getOptArgData()).bare();
+            AstroTag nameTag = getSchema().obtainTagForName(name);
+            return leafTag(nameTag, token.getSource());
+        } else {
+            return token;
+        }
+    }
+
+    /**
      *
      */
     protected Astro leafInternal(AstroTag tag,



1.14      +38 -3     e/src/jsrc/org/quasiliteral/term/TermParser.java

Index: TermParser.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/TermParser.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- TermParser.java	2001/12/10 06:11:03	1.13
+++ TermParser.java	2001/12/10 16:55:33	1.14
@@ -424,6 +424,21 @@
     /* Eaten as whitespace at a higher level */
     TheTokens[EOL]              = "EOL";
 
+    /* Single-Character Tokens */
+    TheTokens['|']              = "VerticalBar";
+    TheTokens['^']              = "Caret";
+    TheTokens['+']              = "Plus";
+    TheTokens['*']              = "Star";
+    TheTokens['$']              = "Dollar";
+    TheTokens['@']              = "At";
+    TheTokens[',']              = "Comma";
+    TheTokens['?']              = "Question";
+    TheTokens['.']              = "Dot";
+
+    TheTokens['(']              = "OpenParen";
+    TheTokens[')']              = "CloseParen";
+    TheTokens['{']              = "OpenBrace";
+    TheTokens['}']              = "CloseBrace";
 }
 
 /**
@@ -432,7 +447,7 @@
 static public final AstroSchema DEFAULT_SCHEMA =
   new BaseSchema("Term-Tree-Language", ConstList.fromArray(TheTokens));
 
-//#line 384 "TermParser.java"
+//#line 399 "TermParser.java"
 //###############################################################
 // method: yylexdebug : check lexer state
 //###############################################################
@@ -636,7 +651,7 @@
 break;
 case 17:
 //#line 109 "term.y"
-{ yyval = b.argGroup(val_peek(2), (String)val_peek(0)); }
+{ yyval = b.argGroup(val_peek(2),   (String)val_peek(0)); }
 break;
 case 18:
 //#line 110 "term.y"
@@ -654,6 +669,26 @@
 //#line 116 "term.y"
 { yyval = "*"; }
 break;
+case 22:
+//#line 120 "term.y"
+{ yyval = b.functor((Astro)val_peek(0)); }
+break;
+case 23:
+//#line 121 "term.y"
+{ yyval = b.functor((Astro)val_peek(0)); }
+break;
+case 24:
+//#line 122 "term.y"
+{ yyval = b.functor((Astro)val_peek(0)); }
+break;
+case 25:
+//#line 123 "term.y"
+{ yyval = b.functor((Astro)val_peek(0)); }
+break;
+case 26:
+//#line 124 "term.y"
+{ yyval = b.functor((Astro)val_peek(0)); }
+break;
 case 27:
 //#line 131 "term.y"
 { yyval = b.dollarHole((Astro)val_peek(1)); }
@@ -662,7 +697,7 @@
 //#line 132 "term.y"
 { yyval = b.atHole(    (Astro)val_peek(1)); }
 break;
-//#line 611 "TermParser.java"
+//#line 646 "TermParser.java"
 //########## END OF USER-SUPPLIED ACTIONS ##########
     }//switch
     //#### Now let's reduce... ####



1.13      +21 -6     e/src/jsrc/org/quasiliteral/term/term.y

Index: term.y
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/term.y,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- term.y	2001/12/10 06:11:03	1.12
+++ term.y	2001/12/10 16:55:33	1.13
@@ -106,7 +106,7 @@
  |      term quant                   { $$ = b.seq((Astro)$1, (String)$2); }
  |           quant                   { $$ = b.seq(null,      (String)$1); }
  |           '.'                     { $$ = b.seq(null,      "."); }
- |      '(' args ')' quant           { $$ = b.argGroup($2, (String)$4); }
+ |      '(' args ')' quant           { $$ = b.argGroup($2,   (String)$4); }
  |      '^' LiteralString            { $$ = b.unpack((Astro)$2); }
  ;
 
@@ -117,11 +117,11 @@
  ;
 
 functor:
-        ID
- |      LiteralChar
- |      LiteralInteger
- |      LiteralFloat64
- |      LiteralString
+        ID                           { $$ = b.functor((Astro)$1); }
+ |      LiteralChar                  { $$ = b.functor((Astro)$1); }
+ |      LiteralInteger               { $$ = b.functor((Astro)$1); }
+ |      LiteralFloat64               { $$ = b.functor((Astro)$1); }
+ |      LiteralString                { $$ = b.functor((Astro)$1); }
  ;
 
 /**
@@ -253,6 +253,21 @@
     /* Eaten as whitespace at a higher level */
     TheTokens[EOL]              = "EOL";
 
+    /* Single-Character Tokens */
+    TheTokens['|']              = "VerticalBar";
+    TheTokens['^']              = "Caret";
+    TheTokens['+']              = "Plus";
+    TheTokens['*']              = "Star";
+    TheTokens['$']              = "Dollar";
+    TheTokens['@']              = "At";
+    TheTokens[',']              = "Comma";
+    TheTokens['?']              = "Question";
+    TheTokens['.']              = "Dot";
+
+    TheTokens['(']              = "OpenParen";
+    TheTokens[')']              = "CloseParen";
+    TheTokens['{']              = "OpenBrace";
+    TheTokens['}']              = "CloseBrace";
 }
 
 /**