[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";
}
/**