changeset 98:aec3b16144fe

- Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement. - Added method parseType(). - Added missing break statement in parseBasicType(). - Added method parseDeclaratorSuffix() and parseDeclarator().
author aziz
date Sat, 07 Jul 2007 10:51:00 +0000
parents 1a83e5070a84
children 6b8c248f5911
files trunk/src/Parser.d
diffstat 1 files changed, 66 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Parser.d	Fri Jul 06 20:28:00 2007 +0000
+++ b/trunk/src/Parser.d	Sat Jul 07 10:51:00 2007 +0000
@@ -548,6 +548,9 @@
 //       e = new IsExpression();
       break;
     case T.LParen:
+      nT();
+      e = parseExpression();
+      require(T.RParen);
       break;
     // BasicType . Identifier
     case T.Void,   T.Char,    T.Wchar,  T.Dchar, T.Bool,
@@ -570,6 +573,7 @@
         errorIfNot(T.Identifier);
 
       e = new TypeDotIdExpression(type, ident);
+      break;
     default:
 //       error();
     }
@@ -603,6 +607,11 @@
     return es;
   }
 
+  Type parseType()
+  {
+    return parseDeclaratorSuffix(parseBasicType2(parseBasicType()));
+  }
+
   Type parseBasicType()
   {
     Type t;
@@ -659,6 +668,7 @@
       {
       case T.Mul:
         t = new PointerType(t);
+        nT();
         break;
       case T.LBracket:
         nT();
@@ -672,21 +682,66 @@
           t = new ArrayType(t, parseExpression());
           require(T.RBracket);
         }
+        break;
+      case T.Function, T.Delegate:
+        TOK tok = token.type;
+        nT();
+        auto args = parseParameters();
+//         if (tok == T.Function)
+//           t = new FunctionType();
+//         else
+//           t = new DelegateType();
+        break;
+      default:
+        return t;
+      }
+    }
+    assert(0);
+  }
+
+  Type parseDeclaratorSuffix(Type t)
+  {
+    while (1)
+    {
+      switch (token.type)
+      {
+      case T.LBracket:
+        nT();
+        if (token.type == T.RBracket)
+        {
+          t = new ArrayType(t, null);
+          nT();
+        }
+        else
+        {
+          t = new ArrayType(t, parseExpression());
+          require(T.RBracket);
+        }
         continue;
-      case T.Function, T.Delegate:
-        TOK tok = token.type;
-        nT();
-        auto args = parseParameters();
-//         if (tok == T.Function)
-//           t = new FunctionType();
-//         else
-//           t = new DelegateType();
-      default:
-        return t;
+      case T.LParen:
+        auto params = parseParameters();
+        // new FunctionType(params);
+        break;
       }
+      break;
+    }
+    return t;
+  }
+
+  Type parseDeclarator(ref string ident)
+  {
+    auto t = parseBasicType2(parseBasicType());
+
+    if (token.type == T.Identifier)
+    {
+      ident = token.srcText;
       nT();
     }
-    assert(0);
+    else
+      errorIfNot(T.Identifier);
+
+    t = parseDeclaratorSuffix(t);
+    return t;
   }
 
   Argument[] parseParameters()