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