diff parser/Parser.d @ 28:69464d465284 new_gen

Now supporting structs - both read and write. Still a few errors though, so watch out.
author Anders Johnsen <skabet@gmail.com>
date Sun, 20 Apr 2008 11:20:28 +0200
parents e331e4e816e4
children 41d23f2762c3
line wrap: on
line diff
--- a/parser/Parser.d	Sun Apr 20 01:08:50 2008 +0200
+++ b/parser/Parser.d	Sun Apr 20 11:20:28 2008 +0200
@@ -25,15 +25,15 @@
 
         while(lexer.peek.type != Tok.EOF)
         {
-            declarations ~= parseDecl;
+            declarations ~= parseRootDecl;
         }
 
         return declarations;
     }
 
-    Decl parseDecl()
+    Decl parseRootDecl()
     {
-        Token t = lexer.next;
+        Token t = lexer.peek;
 
         switch(t.type)
         {
@@ -46,21 +46,24 @@
                  Tok.Identifier:
                 Identifier type = new Identifier(t);
 
-                Token iden = lexer.next;
+                Token iden = lexer.peek(1);
 
                 switch(iden.type)
                 {
                     case Tok.Identifier:
                         Identifier identifier = new Identifier(iden);
-                        Token p = lexer.peek();
+                        Token p = lexer.peek(2);
                         switch(p.type)
                         {
                             case Tok.OpenParentheses:
+                                lexer.next; lexer.next;
                                 return parseFunc(type, identifier);
                             case Tok.Seperator:
+                                lexer.next; lexer.next;
                                 require(Tok.Seperator);
                                 return new VarDecl(type, identifier, null);
                             case Tok.Assign:
+                                lexer.next; lexer.next;
                                 lexer.next();
                                 auto exp = parseExpression();
                                 require(Tok.Seperator);
@@ -76,6 +79,7 @@
                 }
                 break;
             case Tok.Struct:
+                lexer.next;
                 Token iden = lexer.next;
                 switch(iden.type)
                 {
@@ -94,6 +98,61 @@
         }
     }
 
+    Decl parseDecl()
+    {
+        Token t = lexer.peek;
+
+        switch(t.type)
+        {
+            case Tok.Byte,  Tok.Ubyte,
+                 Tok.Short, Tok.Ushort,
+                 Tok.Int,   Tok.Uint,
+                 Tok.Long,  Tok.Ulong,
+                 Tok.Float, Tok.Double,
+                 Tok.Bool,
+                 Tok.Identifier:
+                Identifier type = new Identifier(t);
+
+                Token iden = lexer.peek(1);
+
+                switch(iden.type)
+                {
+                    case Tok.Identifier:
+                        Identifier identifier = new Identifier(iden);
+                        Token p = lexer.peek(2);
+                        switch(p.type)
+                        {
+                            case Tok.OpenParentheses:
+                                lexer.next; lexer.next;
+                                return parseFunc(type, identifier);
+                            case Tok.Seperator:
+                                lexer.next; lexer.next;
+                                require(Tok.Seperator);
+                                return new VarDecl(type, identifier, null);
+                            case Tok.Assign:
+                                lexer.next; lexer.next;
+                                lexer.next();
+                                auto exp = parseExpression();
+                                require(Tok.Seperator);
+                                return new VarDecl(type, identifier, exp);
+                            default:
+                                char[] c = t.getType;
+                                error("Unexpexted token "~c~" at line "~Integer.toString(__LINE__));
+                        }
+                        break;
+                    default:
+                        char[] c = t.getType;
+                        error("Unexpexted token "~c~" at line "~Integer.toString(__LINE__));
+                }
+                break;
+            case Tok.EOF:
+                return null;
+            default:
+                char[] c = t.getType;
+                error("Unexpexted token "~c~" at line "~Integer.toString(__LINE__));
+        }
+    }
+
     VarDecl[] parseStruct()
     {
         VarDecl[] varDecls;
@@ -148,6 +207,17 @@
                 Token n = lexer.peek(1);
                 switch(n.type)
                 {
+                    case Tok.Dot:
+                        Exp iden = parseExpIdentifier(new Identifier(lexer.next));
+                        switch(lexer.peek.type)
+                        {
+                            case Tok.Assign:
+                                lexer.next;
+                                auto stmt = new ExpStmt(new AssignExp(iden , parseExpression()));
+                                require(Tok.Seperator);
+                                return stmt;
+                                break;
+                        }
                     case Tok.Assign:
                         lexer.next;
                         lexer.next;
@@ -249,6 +319,25 @@
 
     // -- Expression parsing -- //
 private:
+    Exp parseExpIdentifier(Exp target)
+    {
+        switch(lexer.peek.type)
+        {
+            case Tok.Dot:
+                switch(lexer.peek(1).type)
+                {
+                    case Tok.Identifier:
+                        lexer.next;
+                        return parseExpIdentifier(
+                                new MemberLookup(target, new Identifier(lexer.next)));
+                    default:
+                        throw new Error("Expected identifier after '.'", lexer.peek(1).location);
+                }
+            default:
+                return target;
+        }
+    }
+
     Exp parseExpression(int p = 0)
     {
         auto exp = P();
@@ -279,6 +368,7 @@
         }
         else if (next.type == Tok.Identifier)
         {
+            Exp iden = parseExpIdentifier(new Identifier(next));
             switch(lexer.peek.type)
             {
                 case Tok.OpenParentheses:
@@ -294,10 +384,10 @@
                     }
 
                     lexer.next();
-                    return new CallExp(new Identifier(next), args);
+                    return new CallExp(iden, args);
 
                 default:
-                    return new Identifier(next);
+                    return iden;
             }
         }
         else if (next.type == Tok.Integer)