diff parser/Parser.d @ 143:d76cc5cad4fc

Added partial support for switches. Added support for extern(C) in CodeGen.
author Anders Johnsen <skabet@gmail.com>
date Mon, 21 Jul 2008 01:05:20 +0200
parents 927ae00bd9d2
children 6e6355fb5f0f
line wrap: on
line diff
--- a/parser/Parser.d	Sun Jul 20 23:41:53 2008 +0200
+++ b/parser/Parser.d	Mon Jul 21 01:05:20 2008 +0200
@@ -133,7 +133,6 @@
             t = lexer.peek;
         }
 
-
         if (t.isBasicType || t.isIdentifier)
         {
             Id type;
@@ -532,8 +531,57 @@
         }
         else if(t.isSwitch)
         {
-            messages.report(UnexpectedTok, lexer.peek.location).arg(lexer.next.getType);
-            return null;
+            lexer.next;
+            require(Tok.OpenParentheses);
+            auto target = parseExpression();
+            auto res = action.actOnStartOfSwitchStmt(target);
+            require(Tok.CloseParentheses);
+            require(Tok.OpenBrace);
+            while (true)
+            {
+                Stmt[] statements;
+                if (skip(Tok.Default))
+                {
+                    require(Tok.Colon);
+                    statements.length = 0;
+                    while (lexer.peek.type != Tok.Case
+                            && lexer.peek.type != Tok.Default
+                            && lexer.peek.type != Tok.CloseBrace)
+                        statements ~= parseStatement();
+                    action.actOnDefaultStmt(res, statements);
+                    continue;
+                }
+
+                Token _case = lexer.peek;
+                if (_case.type != Tok.Case)
+                    break;
+                lexer.next();
+
+                Exp[] literals;
+                do
+                {
+                    Exp e = parseExpression();
+//                    IntegerLit lit = cast(IntegerLit)e;
+//                    if (lit is null)
+//                        messages.report(CaseValueMustBeInt, lexer.peek.location).arg(lexer.next.getType);
+//                    else
+                    literals ~= e;
+                }
+                while (skip(Tok.Comma));
+                require(Tok.Colon);
+
+                while (lexer.peek.type != Tok.Case
+                        && lexer.peek.type != Tok.Default
+                        && lexer.peek.type != Tok.CloseBrace)
+                    statements ~= parseStatement();
+
+                action.actOnCaseStmt(res, literals, statements);
+
+                if (lexer.peek.type == Tok.CloseBrace)
+                    break;
+            }
+            require(Tok.CloseBrace);
+            return res;
         }
         else
         {