changeset 243:461e544ebb53

- Added method requireId(). - In parseUnaryExpression(): moved nT() out of some case blocks because it's common. Only two cases have to skip nT() with a goto. - Changed type of member ident of TypeDotIdExpression to Token*.
author aziz
date Wed, 01 Aug 2007 11:12:00 +0000
parents 7ec7ad8df9da
children 829fdb2e2915
files trunk/src/Expressions.d trunk/src/Parser.d
diffstat 2 files changed, 29 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Expressions.d	Wed Aug 01 10:12:01 2007 +0000
+++ b/trunk/src/Expressions.d	Wed Aug 01 11:12:00 2007 +0000
@@ -569,8 +569,8 @@
 class TypeDotIdExpression : Expression
 {
   Type type;
-  string ident;
-  this(Type type, string ident)
+  Token* ident;
+  this(Type type, Token* ident)
   {
     this.type = type;
     this.ident = ident;
--- a/trunk/src/Parser.d	Wed Aug 01 10:12:01 2007 +0000
+++ b/trunk/src/Parser.d	Wed Aug 01 11:12:00 2007 +0000
@@ -2604,39 +2604,39 @@
     switch (token.type)
     {
     case T.AndBinary:
-      nT(); e = new AddressExpression(parseUnaryExpression());
+      e = new AddressExpression(parseUnaryExpression());
       break;
     case T.PlusPlus:
-      nT(); e = new PreIncrExpression(parseUnaryExpression());
+      e = new PreIncrExpression(parseUnaryExpression());
       break;
     case T.MinusMinus:
-      nT(); e = new PreDecrExpression(parseUnaryExpression());
+      e = new PreDecrExpression(parseUnaryExpression());
       break;
     case T.Mul:
-      nT(); e = new DerefExpression(parseUnaryExpression());
+      e = new DerefExpression(parseUnaryExpression());
       break;
     case T.Minus:
     case T.Plus:
-      nT(); e = new SignExpression(parseUnaryExpression());
+      e = new SignExpression(parseUnaryExpression());
       break;
     case T.Not:
-      nT(); e = new NotExpression(parseUnaryExpression());
+      e = new NotExpression(parseUnaryExpression());
       break;
     case T.Tilde:
-      nT(); e = new CompExpression(parseUnaryExpression());
+      e = new CompExpression(parseUnaryExpression());
       break;
     case T.New:
       e = parseNewExpression();
       return e;
     case T.Delete:
-      nT(); e = new DeleteExpression(parseUnaryExpression());
+      e = new DeleteExpression(parseUnaryExpression());
       break;
     case T.Cast:
       requireNext(T.LParen);
       auto type = parseType();
       require(T.RParen);
       e = new CastExpression(parseUnaryExpression(), type);
-      break;
+      goto Lset;
     case T.LParen:
       // ( Type ) . Identifier
       Type parseType_()
@@ -2651,10 +2651,9 @@
       auto type = try_(parseType_(), success);
       if (success)
       {
-        // TODO: save Token instead of string
-        string ident = requireIdentifier();
+        auto ident = requireId();
         e = new TypeDotIdExpression(type, ident);
-        break;
+        goto Lset;
       }
       goto default;
     default:
@@ -2662,6 +2661,8 @@
       return e;
     }
     assert(e !is null);
+    nT();
+  Lset:
     set(e, begin);
     return e;
   }
@@ -2990,7 +2991,7 @@
          T.Cfloat, T.Cdouble, T.Creal, T.Void:
       auto type = new Type(token.type);
       requireNext(T.Dot);
-      auto ident = requireIdentifier();
+      auto ident = requireId();
 
       e = new TypeDotIdExpression(type, ident);
       break;
@@ -3527,6 +3528,19 @@
     return identifier;
   }
 
+  Token* requireId()
+  {
+    if (token.type == T.Identifier)
+    {
+      auto id = token;
+      nT();
+      return id;
+    }
+    else
+      error(MID.ExpectedButFound, "Identifier", token.srcText);
+    return null;
+  }
+
   void error(MID id, ...)
   {
     if (trying)