summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-07-11 13:02:40 +0000
committerMartin Odersky <odersky@gmail.com>2003-07-11 13:02:40 +0000
commitca9f4fbb7b1212cfcde866ee95957afc6d157943 (patch)
tree20ef511d9ccb659a8d876477120994bea680e1d2 /sources/scalac
parent319090d57b6736033c0e635da83ff571df5bd1d0 (diff)
downloadscala-ca9f4fbb7b1212cfcde866ee95957afc6d157943.tar.gz
scala-ca9f4fbb7b1212cfcde866ee95957afc6d157943.tar.bz2
scala-ca9f4fbb7b1212cfcde866ee95957afc6d157943.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/ast/parser/Parser.java106
-rw-r--r--sources/scalac/ast/parser/Scanner.java7
-rw-r--r--sources/scalac/ast/parser/Tokens.java6
-rw-r--r--sources/scalac/util/Names.java6
4 files changed, 114 insertions, 11 deletions
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index 87c8989f33..1f6c7e31f8 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -153,6 +153,7 @@ public class Parser implements Tokens {
case SYMBOLLIT: case TRUE: case FALSE: case NULL: case IDENTIFIER:
case THIS: case SUPER: case IF:
case FOR: case NEW: case USCORE:
+ case TRY: case WHILE: case DO:
case LPAREN: case LBRACE:
return true;
default:
@@ -199,6 +200,14 @@ public class Parser implements Tokens {
return make.Select(pos, make.Ident(pos, Names.scala), name);
}
+ Tree scalaRuntimeDot(int pos, Name name) {
+ return make.Select(pos, scalaDot(pos, Names.runtime), name);
+ }
+
+ Tree ScalaRunTimeDot(int pos, Name name) {
+ return make.Select(pos, scalaRuntimeDot(pos, Names.ScalaRunTime), name);
+ }
+
Tree scalaBooleanDot(int pos, Name name) {
return make.Select(pos, scalaDot(pos, Names.Boolean), name);
}
@@ -253,6 +262,54 @@ public class Parser implements Tokens {
return make.Apply(pos, make.Select(pos, rhs, name), new Tree[]{cont});
}
+ Tree makeTry(int pos, Tree body, Tree catcher, Tree finalizer) {
+ Tree t = body;
+ if (catcher != Tree.Empty)
+ t =
+ make.Apply(
+ pos,
+ make.Select(
+ pos,
+ make.Apply(
+ pos, ScalaRunTimeDot(pos, Names.Try), new Tree[]{t}),
+ Names.Catch),
+ new Tree[]{catcher});
+ if (finalizer != Tree.Empty)
+ t =
+ make.Apply(
+ pos,
+ make.Select(
+ pos,
+ make.Apply(
+ pos, ScalaRunTimeDot(pos, Names.Try), new Tree[]{t}),
+ Names.Finally),
+ new Tree[]{finalizer});
+ return t;
+ }
+
+ Tree makeWhile(int pos, Tree cond, Tree body) {
+ return
+ make.Apply(
+ pos,
+ make.Apply(
+ pos, ScalaRunTimeDot(pos, Names.While), new Tree[]{cond}),
+ new Tree[]{body});
+ }
+
+ Tree makeDoWhile(int pos, Tree body, Tree cond) {
+ return
+ make.Apply(
+ pos,
+ make.Select(
+ pos,
+ make.Apply(
+ pos,
+ ScalaRunTimeDot(pos, Names.Do),
+ new Tree[]{body}),
+ Names.While),
+ new Tree[]{cond});
+ }
+
/** Convert tree to formal parameter list
*/
ValDef[] convertToParams(Tree t) {
@@ -674,6 +731,9 @@ public class Parser implements Tokens {
/** Expr ::= Bindings `=>' Expr
* | if `(' Expr `)' Expr [[`;'] else Expr]
+ * | try `{' block `}' [catch Expr] [finally Expr]
+ * | while `(' Expr `)' Expr
+ * | do Expr [`;'] while `(' Expr `)'
* | for `(' Enumerators `)' (do | yield) Expr
* | [SimpleExpr `.'] Id `=' Expr
* | SimpleExpr ArgumentExprs `=' Expr
@@ -696,19 +756,45 @@ public class Parser implements Tokens {
} else {
elsep = Tree.Empty;
}
- return make.If(pos, cond, thenp, elsep) ;
+ return make.If(pos, cond, thenp, elsep);
+ } else if (s.token == TRY) {
+ int pos = s.skipToken();
+ accept(LBRACE);
+ Tree body = block(pos);
+ accept(RBRACE);
+ Tree catcher = Tree.Empty;
+ if (s.token == CATCH) {
+ s.nextToken();
+ catcher = expr();
+ }
+ Tree finalizer = Tree.Empty;
+ if (s.token == FINALLY) {
+ s.nextToken();
+ finalizer = expr();
+ }
+ return makeTry(pos, body, catcher, finalizer);
+ } else if (s.token == WHILE) {
+ int pos = s.skipToken();
+ accept(LPAREN);
+ Tree cond = expr();
+ accept(RPAREN);
+ Tree body = expr();
+ return makeWhile(pos, cond, body);
+ } else if (s.token == DO) {
+ int pos = s.skipToken();
+ Tree body = expr();
+ if (s.token == SEMI) s.nextToken();
+ accept(WHILE);
+ accept(LPAREN);
+ Tree cond = expr();
+ accept(RPAREN);
+ return makeDoWhile(pos, body, cond);
} else if (s.token == FOR) {
s.nextToken();
Tree[] enums;
- if (s.token == LBRACE) {
- accept(LBRACE);
- enums = enumerators();
- accept(RBRACE);
- } else {
- accept(LPAREN);
- enums = enumerators();
- accept(RPAREN);
- }
+ accept(LPAREN);
+ enums = enumerators();
+ accept(RPAREN);
if (s.token == DO) {
return makeFor(s.skipToken(), enums, Names.foreach, Names.foreach, expr());
} else if (s.token == YIELD) {
diff --git a/sources/scalac/ast/parser/Scanner.java b/sources/scalac/ast/parser/Scanner.java
index 5573ce3e05..da022bd953 100644
--- a/sources/scalac/ast/parser/Scanner.java
+++ b/sources/scalac/ast/parser/Scanner.java
@@ -115,7 +115,7 @@ public class Scanner extends TokenData {
fetchToken();
switch (token) {
case ELSE: case EXTENDS: case WITH:
- case YIELD: case DO:
+ case YIELD: case CATCH: case FINALLY:
case COMMA: case SEMI: case DOT:
case COLON: case EQUALS: case ARROW:
case LARROW: case SUBTYPE: case SUPERTYPE:
@@ -798,6 +798,7 @@ public class Scanner extends TokenData {
enterKeyword("as", AS);
enterKeyword("case", CASE);
enterKeyword("class", CLASS);
+ enterKeyword("catch", CATCH);
enterKeyword("constr", CONSTR);
enterKeyword("def", DEF);
enterKeyword("do", DO);
@@ -805,6 +806,7 @@ public class Scanner extends TokenData {
enterKeyword("extends", EXTENDS);
enterKeyword("false", FALSE);
enterKeyword("final", FINAL);
+ enterKeyword("finally", FINALLY);
enterKeyword("for", FOR);
enterKeyword("if", IF);
enterKeyword("import", IMPORT);
@@ -816,15 +818,18 @@ public class Scanner extends TokenData {
enterKeyword("package", PACKAGE);
enterKeyword("private", PRIVATE);
enterKeyword("protected", PROTECTED);
+ enterKeyword("return", RETURN);
enterKeyword("sealed", SEALED);
enterKeyword("super", SUPER);
enterKeyword("this", THIS);
enterKeyword("trait", TRAIT);
enterKeyword("true", TRUE);
+ enterKeyword("try", TRY);
enterKeyword("type", TYPE);
enterKeyword("val", VAL);
enterKeyword("var", VAR);
enterKeyword("with", WITH);
+ enterKeyword("while", WHILE);
enterKeyword("yield", YIELD);
enterKeyword(".", DOT);
enterKeyword("_", USCORE);
diff --git a/sources/scalac/ast/parser/Tokens.java b/sources/scalac/ast/parser/Tokens.java
index f2e3bc39ad..9ec7878918 100644
--- a/sources/scalac/ast/parser/Tokens.java
+++ b/sources/scalac/ast/parser/Tokens.java
@@ -61,6 +61,12 @@ public interface Tokens {
DO = 51,
TRAIT = 52,
SEALED = 53,
+ /* THROW = 54, */
+ TRY = 55,
+ CATCH = 56,
+ FINALLY = 57,
+ WHILE = 58,
+ RETURN = 59,
/* special symbols */
COMMA = 61,
diff --git a/sources/scalac/util/Names.java b/sources/scalac/util/Names.java
index 1c394a8ba2..069fafbbad 100644
--- a/sources/scalac/util/Names.java
+++ b/sources/scalac/util/Names.java
@@ -37,9 +37,12 @@ public class Names {
public static final Name AnyRef = Name.fromString("AnyRef");
public static final Name Array = Name.fromString("Array");
public static final Name Byte = Name.fromString("Byte");
+ public static final Name Catch = Name.fromString("Catch");
public static final Name Char = Name.fromString("Char");
public static final Name Boolean = Name.fromString("Boolean");
+ public static final Name Do = Name.fromString("Do");
public static final Name Double = Name.fromString("Double");
+ public static final Name Finally = Name.fromString("Finally");
public static final Name Float = Name.fromString("Float");
public static final Name Function = Name.fromString("Function");
public static final Name Int = Name.fromString("Int");
@@ -50,13 +53,16 @@ public class Names {
public static final Name Object = Name.fromString("Object");
public static final Name PartialFunction = Name.fromString("PartialFunction");
public static final Name Predef = Name.fromString("Predef");
+ public static final Name ScalaRunTime = Name.fromString("ScalaRunTime");
public static final Name Seq = Name.fromString("Seq");
public static final Name Short = Name.fromString("Short");
public static final Name String = Name.fromString("String");
public static final Name Symbol = Name.fromString("Symbol");
public static final Name Throwable = Name.fromString("Throwable");
+ public static final Name Try = Name.fromString("Try");
public static final Name Tuple = Name.fromString("Tuple");
public static final Name Unit = Name.fromString("Unit");
+ public static final Name While = Name.fromString("While");
public static final Name apply = Name.fromString("apply");
public static final Name as = Name.fromString("as");
public static final Name box = Name.fromString("box");