diff options
author | Martin Odersky <odersky@gmail.com> | 2003-02-20 13:15:06 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-02-20 13:15:06 +0000 |
commit | 17bd66e3cf7734ccf1ccd3a0adb987feb880d325 (patch) | |
tree | 52c57891aac018ce89643e41dd0dd05170ae42ab /sources/scalac/ast | |
parent | 2fc8c8dc203f00a936aab60dba50c2d7e4ae054b (diff) | |
download | scala-17bd66e3cf7734ccf1ccd3a0adb987feb880d325.tar.gz scala-17bd66e3cf7734ccf1ccd3a0adb987feb880d325.tar.bz2 scala-17bd66e3cf7734ccf1ccd3a0adb987feb880d325.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac/ast')
-rw-r--r-- | sources/scalac/ast/TreeInfo.java | 9 | ||||
-rw-r--r-- | sources/scalac/ast/parser/Parser.java | 129 | ||||
-rw-r--r-- | sources/scalac/ast/printer/TextTreePrinter.java | 11 |
3 files changed, 71 insertions, 78 deletions
diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java index 81d9481f31..75d6dfa863 100644 --- a/sources/scalac/ast/TreeInfo.java +++ b/sources/scalac/ast/TreeInfo.java @@ -120,6 +120,15 @@ public class TreeInfo { } } + public static boolean isVarPattern(Tree pat) { + switch (pat) { + case Ident(Name name): + return name.isVariable(); + default: + return false; + } + } + /** The method symbol of an application node, or Symbol.NONE, if none exists. */ public static Symbol methSymbol(Tree tree) { diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java index f9aa54cb3a..7455080054 100644 --- a/sources/scalac/ast/parser/Parser.java +++ b/sources/scalac/ast/parser/Parser.java @@ -15,6 +15,8 @@ import scalac.symtab.Modifiers; import scalac.ast.*; import Tree.*; +//todo: add type idents? + /** A recursive descent parser for the programming language Scala. * * @author Martin Odersky, Matthias Zenger @@ -186,71 +188,32 @@ public class Parser implements Tokens { } } - /** Create tree representing type scala.Any - */ - Tree scalaAnyType(int pos) { - return make.Select(pos, make.Ident(pos, Names.scala), Names.Any.toTypeName()); - } - - /** Create tree representing type scala.Seq - */ - Tree scalaSeqType(int pos) { - return make.Select(pos, make.Ident(pos, Names.scala), Names.Seq.toTypeName()); - } - - /** Create tree representing constructor scala.Object - */ - Tree scalaObjectConstr(int pos) { - return make.Select(pos, make.Ident(pos, Names.scala), Names.Object.toConstrName()); - } - /** Create tree representing method scala.Symbol - */ - Tree scalaSymbol(int pos) { - return make.Select(pos, make.Ident(pos, Names.scala), Names.Symbol); - } - - /** Create tree representing method scala.Labelled - */ - Tree scalaLabelled(int pos) { - return make.Select(pos, make.Ident(pos, Names.scala), Names.Labelled); - } - - /** Create tree representing method scala.Predef.List - */ - Tree scalaPredefList(int pos) { - return make.Select(pos, - make.Select(pos, make.Ident(pos, Names.scala), Names.Predef), - Names.List); - } - - /** Create tree representing type scala.List - */ - Tree scalaListType(int pos) { - return make.Select(pos, make.Ident(pos, Names.scala), Names.List.toTypeName()); + Tree scalaDot(int pos, Name name) { + return make.Select(pos, make.Ident(pos, Names.scala), name); } /** Create tree for for-comprehension <for (enums) do body> or * <for (enums) yield body> where mapName and flatmapName are chosen * corresponding to whether this is a for-do or a for-yield. */ - Tree makeFor(Tree[] enums, Name mapName, Name flatmapName, Tree body) { + Tree makeFor(int pos, Tree[] enums, Name mapName, Name flatmapName, Tree body) { switch (enums[0]) { case PatDef(int mods, Tree pat, Tree rhs): if (enums.length == 1) - return makeFor1(enums[0].pos, mapName, pat, rhs, body); + return makeFor1(pos, mapName, pat, rhs, body); Tree[] newenums = new Tree[enums.length - 1]; switch (enums[1]) { case PatDef(int mods2, Tree pat2, Tree rhs2): System.arraycopy(enums, 1, newenums, 0, newenums.length); - return makeFor1(enums[0].pos, flatmapName, pat, rhs, - makeFor(newenums, mapName, flatmapName, body)); + return makeFor1(pos, flatmapName, pat, rhs, + makeFor(enums[1].pos, newenums, mapName, flatmapName, body)); default: System.arraycopy(enums, 2, newenums, 1, newenums.length - 1); newenums[0] = make.PatDef( enums[0].pos, mods, pat, - makeFor1(enums[0].pos, Names.filter, pat, rhs, enums[1])); - return makeFor(newenums, mapName, flatmapName, body); + makeFor1(enums[1].pos, Names.filter, pat, rhs, enums[1])); + return makeFor(pos, newenums, mapName, flatmapName, body); } default: throw new ApplicationError(); @@ -493,17 +456,17 @@ public class Parser implements Tokens { t = make.Ident(s.pos, Names.null_); break; case SYMBOLLIT: - Tree symt = scalaSymbol(s.pos); + Tree symt = scalaDot(s.pos, Names.Symbol); if (isPattern) symt = convertToTypeId(symt); t = make.Apply(s.pos, symt, new Tree[]{make.Literal(s.pos, s.name.toString())}); s.nextToken(); if (s.token == LPAREN || s.token == LBRACE) { - Tree labt = scalaLabelled(s.pos); + Tree labt = scalaDot(s.pos, Names.Labelled); if (isPattern) labt = convertToTypeId(labt); - Tree listt = isPattern ? scalaListType(s.pos) - : scalaPredefList(s.pos); + Tree listt = isPattern ? scalaDot(s.pos, Names.List.toTypeName()) + : make.Select(s.pos, scalaDot(s.pos, Names.Predef), Names.List); t = make.Apply(s.pos, labt, new Tree[]{t, make.Apply(s.pos, listt, argumentExprs())}); @@ -707,11 +670,9 @@ public class Parser implements Tokens { Tree[] enums = enumerators(); accept(RPAREN); if (s.token == DO) { - s.nextToken(); - return makeFor(enums, Names.foreach, Names.foreach, expr()); + return makeFor(s.skipToken(), enums, Names.foreach, Names.foreach, expr()); } else if (s.token == YIELD) { - s.nextToken(); - return makeFor(enums, Names.map, Names.flatmap, expr()); + return makeFor(s.skipToken(), enums, Names.map, Names.flatmap, expr()); } else { return syntaxError("`do' or `yield' expected", true); } @@ -962,9 +923,26 @@ public class Parser implements Tokens { */ Tree generator() { int pos = accept(VAL); - Tree p = pattern(); + Tree pat = pattern(); accept(LARROW); - return make.PatDef(pos, 0, p, expr()); + Tree rhs = expr(); + if (!TreeInfo.isVarPattern(pat)) + rhs = make.Apply( + rhs.pos, + make.Select(rhs.pos, rhs, Names.filter), + new Tree[]{ + make.Visitor( + rhs.pos, + new Tree.CaseDef[]{ + (CaseDef)make.CaseDef( + rhs.pos, pat, Tree.Empty, + make.Select(rhs.pos, + scalaDot(rhs.pos, Names.Boolean), Names.True)), + (CaseDef)make.CaseDef( + rhs.pos, make.Ident(rhs.pos, Names.WILDCARD), Tree.Empty, + make.Select(rhs.pos, + scalaDot(rhs.pos, Names.Boolean), Names.False))})}); + return make.PatDef(pos, 0, pat, rhs); } //////// PATTERNS //////////////////////////////////////////////////////////// @@ -989,11 +967,8 @@ public class Parser implements Tokens { int base = sp; Tree top = simplePattern(); if (s.token == COLON) { - switch (top) { - case Ident(Name name): - if (name.isVariable()) - return make.Typed(s.skipToken(), top, type1()); - } + if (TreeInfo.isVarPattern(top)) + return make.Typed(s.skipToken(), top, type1()); } while (s.token == IDENTIFIER) { top = reduceStack( @@ -1159,7 +1134,9 @@ public class Parser implements Tokens { if (s.token == IDENTIFIER && s.name == STAR) { s.nextToken(); mods |= Modifiers.REPEATED; - tp = make.AppliedType(tp.pos, scalaSeqType(tp.pos), new Tree[]{tp}); + tp = make.AppliedType(tp.pos, + scalaDot(tp.pos, Names.Seq.toTypeName()), + new Tree[]{tp}); } return (ValDef)make.ValDef(pos, mods, name, tp, Tree.Empty); } @@ -1190,7 +1167,7 @@ public class Parser implements Tokens { s.nextToken(); tp = type(); } else { - tp = scalaAnyType(pos); + tp = scalaDot(pos, Names.Any.toTypeName()); } return make.TypeDef(pos, Modifiers.PARAM, name.toTypeName(), Tree.ExtTypeDef.EMPTY_ARRAY, tp); @@ -1390,7 +1367,7 @@ public class Parser implements Tokens { if (tp == Tree.Empty || s.token == EQUALS) return make.ValDef(pos, mods, name, tp, equalsExpr()); else - return make.ValDef(pos, mods | Modifiers.ABSTRACT, name, tp, Tree.Empty); + return make.ValDef(pos, mods | Modifiers.DEFERRED, name, tp, Tree.Empty); default: return make.PatDef(pos, mods, pat, equalsExpr()); } @@ -1415,7 +1392,7 @@ public class Parser implements Tokens { } return make.ValDef(pos, mods | Modifiers.MUTABLE, name, type, rhs); } else { - return make.ValDef(pos, mods | Modifiers.MUTABLE | Modifiers.ABSTRACT, + return make.ValDef(pos, mods | Modifiers.MUTABLE | Modifiers.DEFERRED, name, type, Tree.Empty); } } @@ -1437,7 +1414,7 @@ public class Parser implements Tokens { return make.DefDef(pos, mods, name, tparams, vparams, restype, equalsExpr()); else - return make.DefDef(pos, mods | Modifiers.ABSTRACT, name, + return make.DefDef(pos, mods | Modifiers.DEFERRED, name, tparams, vparams, restype, Tree.Empty); } @@ -1458,7 +1435,7 @@ public class Parser implements Tokens { return make.DefDef(pos, mods, name, tparams, vparams, restype, (s.token == LBRACE) ? blockConstr() : constr()); } else - return make.DefDef(pos, mods | Modifiers.ABSTRACT, name, + return make.DefDef(pos, mods | Modifiers.DEFERRED, name, tparams, vparams, restype, Tree.Empty); } @@ -1470,7 +1447,7 @@ public class Parser implements Tokens { Name name = ident().toTypeName(); if (s.token == SUBTYPE) { s.nextToken(); - return make.TypeDef(pos, mods | Modifiers.ABSTRACT, name, + return make.TypeDef(pos, mods | Modifiers.DEFERRED, name, Tree.ExtTypeDef.EMPTY_ARRAY, type()); } else if (s.token == LBRACKET) { TypeDef[] tparams = typeParamClauseOpt(); @@ -1482,8 +1459,8 @@ public class Parser implements Tokens { Tree.ExtTypeDef.EMPTY_ARRAY, type()); } else if (s.token == SEMI || s.token == COMMA) { return make.TypeDef( - pos, mods | Modifiers.ABSTRACT, name, - Tree.ExtTypeDef.EMPTY_ARRAY, scalaAnyType(pos)); + pos, mods | Modifiers.DEFERRED, name, + Tree.ExtTypeDef.EMPTY_ARRAY, scalaDot(pos, Names.Any.toTypeName())); } else { return syntaxError("`=' or `<:' expected", true); } @@ -1519,12 +1496,14 @@ public class Parser implements Tokens { s.nextToken(); return template(); } else if (s.token == LBRACE) { - return (Template)make.Template( - pos, new Tree[]{scalaObjectConstr(pos)}, templateBody()); + return (Template)make.Template(pos, + new Tree[]{scalaDot(pos, Names.Object.toConstrName())}, + templateBody()); } else { syntaxError("`extends' or `{' expected", true); - return (Template)make.Template( - pos, new Tree[]{scalaObjectConstr(pos)}, Tree.EMPTY_ARRAY); + return (Template)make.Template(pos, + new Tree[]{scalaDot(pos, Names.Object.toConstrName())}, + Tree.EMPTY_ARRAY); } } diff --git a/sources/scalac/ast/printer/TextTreePrinter.java b/sources/scalac/ast/printer/TextTreePrinter.java index 58010b8412..5836e24f0e 100644 --- a/sources/scalac/ast/printer/TextTreePrinter.java +++ b/sources/scalac/ast/printer/TextTreePrinter.java @@ -275,7 +275,11 @@ public class TextTreePrinter implements TreePrinter { print(Text.Space); printSymbolDefinition(tree.symbol(), name); printOpt(TXT_COLON, tpe, false); - printOpt(TXT_EQUAL, rhs, true); + if ((mods & Modifiers.DEFERRED) == 0) { + print(Text.Space); print(TXT_EQUAL); print(Text.Space); + if (rhs == Tree.Empty) print("_"); + else print(rhs); + } break; case PatDef(int mods, Tree pat, Tree rhs): @@ -311,7 +315,7 @@ public class TextTreePrinter implements TreePrinter { print(Text.Space); printSymbolDefinition(tree.symbol(), name); printParams(tparams); - if ((mods & (Modifiers.ABSTRACT | Modifiers.PARAM)) != 0) printOpt(TXT_SUBTYPE, rhs, true); + if ((mods & (Modifiers.DEFERRED | Modifiers.PARAM)) != 0) printOpt(TXT_SUBTYPE, rhs, true); else printOpt(TXT_EQUAL, rhs, true); break; @@ -514,6 +518,7 @@ public class TextTreePrinter implements TreePrinter { print(TXT_UNKNOWN); break; } + //print("{" + tree.type + "}");//DEBUG return this; } @@ -575,7 +580,7 @@ public class TextTreePrinter implements TreePrinter { } protected void printModifiers(int flags) { - if ((flags & Modifiers.ABSTRACT) != 0) { + if ((flags & Modifiers.ABSTRACTCLASS) != 0) { print(KW_ABSTRACT); print(Text.Space); } |