diff options
author | Martin Odersky <odersky@gmail.com> | 2003-07-11 13:02:40 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-07-11 13:02:40 +0000 |
commit | ca9f4fbb7b1212cfcde866ee95957afc6d157943 (patch) | |
tree | 20ef511d9ccb659a8d876477120994bea680e1d2 /sources/scalac/ast | |
parent | 319090d57b6736033c0e635da83ff571df5bd1d0 (diff) | |
download | scala-ca9f4fbb7b1212cfcde866ee95957afc6d157943.tar.gz scala-ca9f4fbb7b1212cfcde866ee95957afc6d157943.tar.bz2 scala-ca9f4fbb7b1212cfcde866ee95957afc6d157943.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac/ast')
-rw-r--r-- | sources/scalac/ast/parser/Parser.java | 106 | ||||
-rw-r--r-- | sources/scalac/ast/parser/Scanner.java | 7 | ||||
-rw-r--r-- | sources/scalac/ast/parser/Tokens.java | 6 |
3 files changed, 108 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, |