changeset 179:507998c5c1ce

- Implemented parseTryStatement(). - Added classes CatchBody and FinallyBody.
author aziz
date Sat, 14 Jul 2007 13:41:01 +0000
parents 62718b29679e
children d5a67aa578a8
files trunk/src/Parser.d trunk/src/Statements.d
diffstat 2 files changed, 70 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Parser.d	Sat Jul 14 11:14:04 2007 +0000
+++ b/trunk/src/Parser.d	Sat Jul 14 13:41:01 2007 +0000
@@ -1175,6 +1175,9 @@
     case T.Synchronized:
       s = parseSynchronizedStatement();
       break;
+    case T.Try:
+      s = parseTryStatement();
+      break;
     default:
       // TODO: issue error msg and return IllegalStatement.
     }
@@ -1491,6 +1494,45 @@
     return new SynchronizedStatement(expr, parseScopeStatement());
   }
 
+  Statement parseTryStatement()
+  {
+    assert(token.type == T.Try);
+    nT();
+
+    auto tryBody = parseScopeStatement();
+    CatchBody[] catchBodies;
+    FinallyBody finBody;
+
+    while (token.type == T.Catch)
+    {
+      nT();
+      Parameter param;
+      if (token.type == T.LParen)
+      {
+        string ident;
+        auto type = parseDeclarator(ident);
+        param = new Parameter(StorageClass.None, type, ident, null);
+        require(T.RParen);
+      }
+      catchBodies ~= new CatchBody(param, parseNoScopeStatement());
+      if (param is null)
+        break; // This is a LastCatch
+    }
+
+    if (token.type == T.Finally)
+    {
+      nT();
+      finBody = new FinallyBody(parseNoScopeStatement());
+    }
+
+    if (catchBodies.length == 0 || finBody is null)
+    {
+      // TODO: issue error msg.
+    }
+
+    return new TryStatement(tryBody, catchBodies, finBody);
+  }
+
   /+++++++++++++++++++++++++++++
   + Expression parsing methods +
   +++++++++++++++++++++++++++++/
--- a/trunk/src/Statements.d	Sat Jul 14 11:14:04 2007 +0000
+++ b/trunk/src/Statements.d	Sat Jul 14 13:41:01 2007 +0000
@@ -221,7 +221,35 @@
 
 class TryStatement : Statement
 {
+  Statement tryBody;
+  CatchBody[] catchBodies;
+  FinallyBody finallyBody;
+  this(Statement tryBody, CatchBody[] catchBodies, FinallyBody finallyBody)
+  {
+    this.tryBody = tryBody;
+    this.catchBodies = catchBodies;
+    this.finallyBody = finallyBody;
+  }
+}
 
+class CatchBody : Statement
+{
+  Parameter param;
+  Statement catchBody;
+  this(Parameter param, Statement catchBody)
+  {
+    this.param = param;
+    this.catchBody = catchBody;
+  }
+}
+
+class FinallyBody : Statement
+{
+  Statement finallyBody;
+  this(Statement finallyBody)
+  {
+    this.finallyBody = finallyBody;
+  }
 }
 
 class ScopeGuardStatement : Statement