Mercurial > projects > dang
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 {