changeset 201:70715b9e2109

- Implemented parseAttributeStatement(). - Parsing declarations in parseStatement() now.
author aziz
date Mon, 16 Jul 2007 09:56:01 +0000
parents 61f60112ac63
children 8aecf8925c5f
files trunk/src/Parser.d trunk/src/Statements.d
diffstat 2 files changed, 61 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Parser.d	Mon Jul 16 08:22:00 2007 +0000
+++ b/trunk/src/Parser.d	Mon Jul 16 09:56:01 2007 +0000
@@ -1303,21 +1303,27 @@
     switch (token.type)
     {
     case T.Extern,
-         T.Align,
-//          T.Pragma,
+         T.Align:
+      d = parseAttributeSpecifier();
+      goto case_DeclarationStatement;
+/+ Not applicable for statements.
 //          T.Deprecated,
 //          T.Private,
 //          T.Package,
 //          T.Protected,
 //          T.Public,
 //          T.Export,
-         //T.Static,
-         T.Final,
 //          T.Override,
 //          T.Abstract,
++/
+         //T.Pragma,
+         //T.Static,
+    case T.Final,
          T.Const,
          T.Auto/+,
          T.Scope+/:
+    case_parseAttribute:
+      s = parseAttributeStatement();
       break;
     case T.Identifier:
       Token next;
@@ -1330,10 +1336,25 @@
         s = new LabeledStatement(ident, parseNoScopeStatement());
         break;
       }
-      goto case_Declaration;
-    case_Declaration:
-      // TODO: parse Declaration
-      break;
+      goto case_parseDeclaration;
+    // Declaration
+    case T.Dot, T.Typeof:
+      bool failed;
+      d = try_(parseDeclaration(), failed);
+      if (!failed)
+        goto case_DeclarationStatement;
+      else
+        goto default; // Expression
+    // BasicType
+    case T.Char,   T.Wchar,   T.Dchar,  T.Bool,
+         T.Byte,   T.Ubyte,   T.Short,  T.Ushort,
+         T.Int,    T.Uint,    T.Long,   T.Ulong,
+         T.Float,  T.Double,  T.Real,
+         T.Ifloat, T.Idouble, T.Ireal,
+         T.Cfloat, T.Cdouble, T.Creal, T.Void:
+    case_parseDeclaration:
+      d = parseDeclaration();
+      goto case_DeclarationStatement;
     case T.If:
       s = parseIfStatement();
       break;
@@ -1383,7 +1404,7 @@
       Token next;
       lx.peek(next);
       if (next.type != T.LParen)
-        goto case_Declaration;
+        goto case_parseAttribute;
       s = parseScopeGuardStatement();
       break;
     case T.Volatile:
@@ -1410,7 +1431,7 @@
         s = parseStaticAssertStatement();
         break;
       default:
-        goto case_Declaration;
+        goto case_parseAttribute;
       }
       assert(0);
     case T.Debug:
@@ -1500,6 +1521,25 @@
     return s;
   }
 
+  Statement parseAttributeStatement()
+  {
+    switch (token.type)
+    {
+    case T.Static,
+         T.Final,
+         T.Const,
+         T.Auto,
+         T.Scope:
+      TOK tok = token.type;
+      nT();
+      //if (token.type == T.LBrace)
+        // TODO: issue error msg.
+      return new AttributeStatement(tok, parseStatement());
+    default:
+    }
+    assert(0);
+  }
+
   Statement parseIfStatement()
   {
     assert(token.type == T.If);
--- a/trunk/src/Statements.d	Mon Jul 16 08:22:00 2007 +0000
+++ b/trunk/src/Statements.d	Mon Jul 16 09:56:01 2007 +0000
@@ -372,3 +372,14 @@
     this.elseBody = elseBody;
   }
 }
+
+class AttributeStatement : Statement
+{
+  TOK tok;
+  Statement statement;
+  this(TOK tok, Statement statement)
+  {
+    this.tok = tok;
+    this.statement = statement;
+  }
+}