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

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Sun, 4 Nov 2001 22:15:51 -0500


markm       01/11/04 22:15:51

  Modified:    src/jsrc/org/erights/e/elang/syntax ELexer.java
               src/jsrc/org/quasiliteral/term SimpleTermBuilder.java
                        Term.updoc TermBuilder.java TermLexer.java
                        TermParser.java term.y
  Log:
  Added quasiFlag

Revision  Changes    Path
1.62      +0 -2      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.61
retrieving revision 1.62
diff -u -r1.61 -r1.62
--- ELexer.java	2001/11/04 21:26:33	1.61
+++ ELexer.java	2001/11/05 03:15:51	1.62
@@ -817,8 +817,6 @@
                 case '"': return '"';
                 case '\'': return '\'';
                 case '\\': return '\\';
-                case '$': return '$';
-                case '@': return '@';
                 case '\n': {
                     //XXX need to move into stringLiteral only
                     //XXX bug: must be accepted at end of string



1.3       +8 -0      e/src/jsrc/org/quasiliteral/term/SimpleTermBuilder.java

Index: SimpleTermBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/SimpleTermBuilder.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SimpleTermBuilder.java	2001/11/04 21:26:34	1.2
+++ SimpleTermBuilder.java	2001/11/05 03:15:51	1.3
@@ -18,12 +18,20 @@
  */
 public class SimpleTermBuilder implements TermBuilder {
 
+    /**
+     *
+     */
     static public final SimpleTermBuilder THE_ONE = new SimpleTermBuilder();
 
     /**
      *
      */
     private SimpleTermBuilder() {}
+
+    /**
+     * @return false
+     */
+    public boolean doesQuasis() { return false; }
 
     /**
      * @return :ConstList(Term)



1.4       +13 -3     e/src/jsrc/org/quasiliteral/term/Term.updoc

Index: Term.updoc
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/Term.updoc,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Term.updoc	2001/11/04 21:26:34	1.3
+++ Term.updoc	2001/11/05 03:15:51	1.4
@@ -4,12 +4,22 @@
     ? def TermParserMaker := <term:TermParser>
     # value: <unsafe:org.quasiliteral.term.TermParser>
     
-    ? TermParserMaker(`foo(3, x:"bar"(3, 'x'), baz)`)
+    ? def term := TermParserMaker(<file:~/Desktop/termtest.txt> getText())
     # value: term`foo(3,
-    #                 x:"bar"(3, 'x'),
-    #                 baz)`
+    #                 x:"bar\tbaz"(3, 'x'),
+    #                 zip)`
     
+    ? term getFunctor()
+    # value: foo
+    
+    ? term getArgs()
+    # value: [term`3`, term`x:"bar\tbaz"(3, 'x')`, term`zip`]
+    
     ? 
+
+
+
+
 
 
     ? def astro__uriGetter := <unsafe:org.quasiliteral.astro.*>



1.3       +11 -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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TermBuilder.java	2001/11/04 21:26:34	1.2
+++ TermBuilder.java	2001/11/05 03:15:51	1.3
@@ -36,6 +36,17 @@
 public interface TermBuilder {
 
     /**
+     * If true, then this builder accepts the hole productions, and the
+     * corresponding lexer should collapse doubled '$', '@', and '`' into
+     * single ones, and should also reject single ones that appear in
+     * uninterpreted contexts.
+     * <p>
+     * If false, then all the hole productions should throw, and
+     * uninterpreted '$', '@', '`' characters should be left alone.
+     */
+    boolean doesQuasis();
+
+    /**
      * The empty terms list
      *
      * @return :PTerms



1.3       +66 -56    e/src/jsrc/org/quasiliteral/term/TermLexer.java

Index: TermLexer.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/quasiliteral/term/TermLexer.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TermLexer.java	2001/11/04 21:26:34	1.2
+++ TermLexer.java	2001/11/05 03:15:51	1.3
@@ -76,7 +76,13 @@
     /**
      *
      */
-    public TermLexer(LineFeeder input)
+    private boolean myQuasiFlag;
+
+    /**
+     * @param input Where lines come from
+     * @param quasiFlag Should doubled @ and $ be collapsed to singles?
+     */
+    public TermLexer(LineFeeder input, boolean quasiFlag)
     throws IOException {
 
         myInput = input;
@@ -90,15 +96,17 @@
         nextChar();
         myIndenter = new Indenter();
         myContinueFlag = false;
+        myQuasiFlag = quasiFlag;
     }
 
     /**
      * @param sourceCode The source code itself
+     * @param quasiFlag Should doubled @ and $ be collapsed to singles?
      */
-    static public TermLexer make(Twine sourceCode) {
+    static public TermLexer make(Twine sourceCode, boolean quasiFlag) {
         LineFeeder lineFeeder = new TwineFeeder(sourceCode);
         try {
-            return new TermLexer(lineFeeder);
+            return new TermLexer(lineFeeder, quasiFlag);
         } catch (IOException ioe) {
             throw ThrowableSugar.backtrace(ioe, "Parsing a string?");
         }
@@ -384,65 +392,67 @@
     /**
      *
      */
-    private char mustEat(char c) throws IOException, SyntaxException {
-        nextChar();
-        if (myChar != c) {
-            syntaxError("" + c + " expected");
-        }
-        return c;
-    }
-
-    /**
-     *
-     */
     private char charConstant() throws IOException, SyntaxException {
-        if (myChar == '\\') {
-            nextChar();
-            switch(myChar) {
-                case 'b': return '\b';
-                case 't': return '\t';
-                case 'n': return '\n';
-                case 'f': return '\f';
-                case 'r': return '\r';
-                case '"': return '"';
-                case '\'': return '\'';
-                case '\\': return '\\';
-                case '$': return mustEat('$');
-                case '@': return mustEat('@');
-                case '\n': {
-                    //XXX need to move into stringLiteral only
-                    //XXX bug: must be accepted at end of string
-                    nextChar();
-                    return charConstant();
-                }
-                case EOFCHAR: {
-                    syntaxError("End of file in middle of literal");
-                }
-                case 'u': {
-                    syntaxError
-                      ("XXX escaped uchar codes not yet implemented");
-                }
-                default: {
-                    if (Character.isDigit((char)myChar)) {
+        switch (myChar) {
+            case '\\': {
+                nextChar();
+                switch(myChar) {
+                    case 'b': return '\b';
+                    case 't': return '\t';
+                    case 'n': return '\n';
+                    case 'f': return '\f';
+                    case 'r': return '\r';
+                    case '"': return '"';
+                    case '\'': return '\'';
+                    case '\\': return '\\';
+                    case '\n': {
+                        //XXX need to move into stringLiteral only
+                        //XXX bug: must be accepted at end of string
+                        nextChar();
+                        return charConstant();
+                    }
+                    case EOFCHAR: {
+                        syntaxError("End of file in middle of literal");
+                    }
+                    case 'u': {
                         syntaxError
-                          ("XXX escaped char codes not yet implemented");
+                          ("XXX escaped uchar codes not yet implemented");
+                    }
+                    default: {
+                        if (Character.isDigit((char)myChar)) {
+                            syntaxError
+                              ("XXX escaped char codes not yet implemented");
+                        } else {
+                            syntaxError("Unrecognized escaped character");
+                        }
+                    }
+                }
+            }
+            case '$':
+            case '@':
+            case '`': {
+                char c = (char)myChar;
+                if (myQuasiFlag) {
+                    nextChar();
+                    if (c == myChar) {
+                        //collapse double to single
+                        return c;
                     } else {
-                        syntaxError("Unrecognized escaped character");
+                        //require double
+                        syntaxError("Expected: " + c + c);
                     }
+                } else {
+                    //treat as a normal character
+                    return c;
                 }
             }
-        } else if (myChar == '$') {
-            return mustEat('$');
-        } else if (myChar == '@') {
-            return mustEat('@');
-        } else if (myChar == '`') {
-            return mustEat('`');
-        } else if (myChar == EOFCHAR) {
-            syntaxError("End of file in middle of literal");
-        } else {
-            return (char)myChar;
+            case EOFCHAR: {
+                syntaxError("End of file in middle of literal");
+            }
+            default: {
+                return (char)myChar;
+            }
         }
-        return 'x'; //keep compiler happy
     }
 
     /**
@@ -683,7 +693,7 @@
                 ("usage: java org.quasiliteral.term.TermLexer file");
         }
         LineFeeder lr = new FileFeeder(url, ins, stdout);
-        TermLexer lex = new TermLexer(lr);
+        TermLexer lex = new TermLexer(lr, false);
         while (true) {
             try {
                 AstroToken t;



1.3       +17 -17    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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TermParser.java	2001/11/04 21:26:34	1.2
+++ TermParser.java	2001/11/05 03:15:51	1.3
@@ -298,7 +298,7 @@
 "literal : LiteralString",
 };
 
-//#line 92 "term.y"
+//#line 93 "term.y"
 
 /**
  * contains all the tokens after yylval
@@ -335,7 +335,7 @@
  *
  */
 static public Object run(Twine source, TermBuilder builder) {
-    TermLexer lexer = TermLexer.make(source);
+    TermLexer lexer = TermLexer.make(source, builder.doesQuasis());
     TermParser parser = new TermParser(lexer, builder);
     return parser.parse();
 }
@@ -560,63 +560,63 @@
       {
 //########## USER-SUPPLIED ACTIONS ##########
 case 1:
-//#line 27 "term.y"
+//#line 28 "term.y"
 { myOptResult = val_peek(0); }
 break;
 case 2:
-//#line 31 "term.y"
+//#line 32 "term.y"
 { yyval = b.term(val_peek(0), b.terms()); }
 break;
 case 3:
-//#line 32 "term.y"
+//#line 33 "term.y"
 { yyval = b.term(val_peek(3), val_peek(1)); }
 break;
 case 4:
-//#line 36 "term.y"
+//#line 37 "term.y"
 { yyval = b.terms(); }
 break;
 case 7:
-//#line 42 "term.y"
+//#line 43 "term.y"
 { yyval = b.atRepr(b.terms(), val_peek(1), val_peek(0)); }
 break;
 case 8:
-//#line 43 "term.y"
+//#line 44 "term.y"
 { yyval = b.atRepr(val_peek(3), val_peek(1), val_peek(0)); }
 break;
 case 9:
-//#line 47 "term.y"
+//#line 48 "term.y"
 { yyval = b.terms(val_peek(0)); }
 break;
 case 10:
-//#line 48 "term.y"
+//#line 49 "term.y"
 { yyval = b.terms(val_peek(2), val_peek(0)); }
 break;
 case 12:
-//#line 51 "term.y"
+//#line 52 "term.y"
 { yyval = b.terms(val_peek(2), val_peek(0)); }
 break;
 case 13:
-//#line 55 "term.y"
+//#line 56 "term.y"
 { yyval = b.dollarRepr(val_peek(1), val_peek(0)); }
 break;
 case 14:
-//#line 59 "term.y"
+//#line 60 "term.y"
 { yyval = b.tag(val_peek(0)); }
 break;
 case 15:
-//#line 60 "term.y"
+//#line 61 "term.y"
 { yyval = b.literal(val_peek(0)); }
 break;
 case 16:
-//#line 61 "term.y"
+//#line 62 "term.y"
 { yyval = b.compound(val_peek(2), val_peek(1), val_peek(0)); }
 break;
 case 20:
-//#line 71 "term.y"
+//#line 72 "term.y"
 { yyval = b.dollarHole(val_peek(1)); }
 break;
 case 21:
-//#line 75 "term.y"
+//#line 76 "term.y"
 { yyval = b.atHole(val_peek(1)); }
 break;
 //#line 568 "TermParser.java"



1.3       +1 -1      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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- term.y	2001/11/04 21:26:34	1.2
+++ term.y	2001/11/05 03:15:51	1.3
@@ -126,7 +126,7 @@
  *
  */
 static public Object run(Twine source, TermBuilder builder) {
-    TermLexer lexer = TermLexer.make(source);
+    TermLexer lexer = TermLexer.make(source, builder.doesQuasis());
     TermParser parser = new TermParser(lexer, builder);
     return parser.parse();
 }