summaryrefslogtreecommitdiff
path: root/sources/scalac/ast/parser/Parser.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/ast/parser/Parser.java')
-rw-r--r--sources/scalac/ast/parser/Parser.java106
1 files changed, 96 insertions, 10 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) {