changeset 72:f75e359f939f

- Added parseExpression() method. - Added while loop to parseAssignExpression(). - Implemented parseCondExpression().
author aziz
date Sun, 01 Jul 2007 17:21:02 +0000
parents b3777cca323c
children 11572f4a138c
files trunk/src/Expressions.d trunk/src/Parser.d
diffstat 2 files changed, 81 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Expressions.d	Sun Jul 01 16:16:05 2007 +0000
+++ b/trunk/src/Expressions.d	Sun Jul 01 17:21:02 2007 +0000
@@ -27,9 +27,20 @@
   }
 }
 
-class CondExpression : Expression
+class CondExpression : BinaryExpression
 {
+  Expression condition;
+  this(Expression condition, Expression left, Expression right)
+  {
+    this.condition = condition;
+    super(left, right, TOK.Comma);
+  }
+}
 
+class CommaExpression : BinaryExpression
+{
+  this(Expression left, Expression right)
+  { super(left, right, TOK.Comma); }
 }
 
 class OrOrExpression : BinaryExpression
--- a/trunk/src/Parser.d	Sun Jul 01 16:16:05 2007 +0000
+++ b/trunk/src/Parser.d	Sun Jul 01 17:21:02 2007 +0000
@@ -39,57 +39,85 @@
     nT = &lx.nextToken;
   }
 
+  Expression parseExpression()
+  {
+    auto e = parseAssignExpression();
+    while (lx.token.type == TOK.Comma)
+      e = new CommaExpression(e, parseExpression());
+    return e;
+  }
+
   Expression parseAssignExpression()
   {
     auto e = parseCondExpression();
-    switch (lx.token.type)
+    while (1)
     {
-    case T.Assign:
-      nT(); e = new AssignExpression(e, parseAssignExpression());
-      break;
-    case T.LShiftAssign:
-      nT(); e = new LShiftAssignExpression(e, parseAssignExpression());
-      break;
-    case T.RShiftAssign:
-      nT(); e = new RShiftAssignExpression(e, parseAssignExpression());
-      break;
-    case T.URShiftAssign:
-      nT(); e = new URShiftAssignExpression(e, parseAssignExpression());
-      break;
-    case T.OrAssign:
-      nT(); e = new OrAssignExpression(e, parseAssignExpression());
-      break;
-    case T.AndAssign:
-      nT(); e = new AndAssignExpression(e, parseAssignExpression());
-      break;
-    case T.PlusAssign:
-      nT(); e = new PlusAssignExpression(e, parseAssignExpression());
-      break;
-    case T.MinusAssign:
-      nT(); e = new MinusAssignExpression(e, parseAssignExpression());
-      break;
-    case T.DivAssign:
-      nT(); e = new DivAssignExpression(e, parseAssignExpression());
-      break;
-    case T.MulAssign:
-      nT(); e = new MulAssignExpression(e, parseAssignExpression());
-      break;
-    case T.ModAssign:
-      nT(); e = new ModAssignExpression(e, parseAssignExpression());
-      break;
-    case T.XorAssign:
-      nT(); e = new XorAssignExpression(e, parseAssignExpression());
-      break;
-    case T.CatAssign:
-      nT(); e = new CatAssignExpression(e, parseAssignExpression());
-      break;
-    default:
+      switch (lx.token.type)
+      {
+      case T.Assign:
+        nT(); e = new AssignExpression(e, parseAssignExpression());
+        break;
+      case T.LShiftAssign:
+        nT(); e = new LShiftAssignExpression(e, parseAssignExpression());
+        break;
+      case T.RShiftAssign:
+        nT(); e = new RShiftAssignExpression(e, parseAssignExpression());
+        break;
+      case T.URShiftAssign:
+        nT(); e = new URShiftAssignExpression(e, parseAssignExpression());
+        break;
+      case T.OrAssign:
+        nT(); e = new OrAssignExpression(e, parseAssignExpression());
+        break;
+      case T.AndAssign:
+        nT(); e = new AndAssignExpression(e, parseAssignExpression());
+        break;
+      case T.PlusAssign:
+        nT(); e = new PlusAssignExpression(e, parseAssignExpression());
+        break;
+      case T.MinusAssign:
+        nT(); e = new MinusAssignExpression(e, parseAssignExpression());
+        break;
+      case T.DivAssign:
+        nT(); e = new DivAssignExpression(e, parseAssignExpression());
+        break;
+      case T.MulAssign:
+        nT(); e = new MulAssignExpression(e, parseAssignExpression());
+        break;
+      case T.ModAssign:
+        nT(); e = new ModAssignExpression(e, parseAssignExpression());
+        break;
+      case T.XorAssign:
+        nT(); e = new XorAssignExpression(e, parseAssignExpression());
+        break;
+      case T.CatAssign:
+        nT(); e = new CatAssignExpression(e, parseAssignExpression());
+        break;
+      default:
+        break;
+      }
       break;
     }
     return e;
   }
+
   Expression parseCondExpression()
   {
+    auto e = parseOrOrExpression();
+    if (lx.token.type == TOK.Question)
+    {
+      nT();
+      auto iftrue = parseExpression();
+//       if (lx.toke.type != TOK.Colon)
+//         error();
+      auto iffalse = parseCondExpression();
+      e = new CondExpression(e, iftrue, iffalse);
+    }
+    return e;
+  }
+
+  Expression parseOrOrExpression()
+  {
     return new Expression();
   }