From d94b70212b2662334bde8e12910616609667e7e5 Mon Sep 17 00:00:00 2001 From: "zik.saleeba" Date: Tue, 17 Feb 2009 23:36:09 +0000 Subject: [PATCH] Syntax of "switch" is now handled. Not semantics though. git-svn-id: http://picoc.googlecode.com/svn/trunk@81 21eae674-98b7-11dd-bd71-f92a316d2d60 --- lex.c | 1 + parse.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- picoc.h | 2 +- tests/05_array.c | 4 ++-- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/lex.c b/lex.c index 20356f7..bda2717 100644 --- a/lex.c +++ b/lex.c @@ -32,6 +32,7 @@ static struct ReservedWord ReservedWords[] = { "break", TokenBreak, NULL }, { "case", TokenCase, NULL }, { "char", TokenCharType, NULL }, + { "continue", TokenContinue, NULL }, { "default", TokenDefault, NULL }, { "do", TokenDo, NULL }, { "double", TokenDoubleType, NULL }, diff --git a/parse.c b/parse.c index b08106c..c79bbe7 100644 --- a/parse.c +++ b/parse.c @@ -576,8 +576,14 @@ int ParseStatement(struct ParseState *Parser, int RunIt) break; case TokenIf: + if (!LexGetToken(Parser, NULL, TRUE) != TokenOpenBracket) + ProgramFail(Parser, "'(' expected"); + Condition = ParseIntExpression(Parser, RunIt); + if (!LexGetToken(Parser, NULL, TRUE) != TokenCloseBracket) + ProgramFail(Parser, "')' expected"); + if (!ParseStatement(Parser, RunIt && Condition)) ProgramFail(Parser, "statement expected"); @@ -665,11 +671,47 @@ int ParseStatement(struct ParseState *Parser, int RunIt) } case TokenSwitch: + if (!LexGetToken(Parser, NULL, TRUE) != TokenOpenBracket) + ProgramFail(Parser, "'(' expected"); + + Condition = ParseIntExpression(Parser, RunIt); + + if (!LexGetToken(Parser, NULL, TRUE) != TokenCloseBracket) + ProgramFail(Parser, "')' expected"); + + if (!LexGetToken(Parser, NULL, FALSE) != TokenLeftBrace) + ProgramFail(Parser, "'{' expected"); + + if (!ParseStatement(Parser, RunIt && Condition)) + ProgramFail(Parser, "statement expected"); + // XXX - implement switch + break; + case TokenCase: - case TokenBreak: - case TokenReturn: + if (!LexGetToken(Parser, &CValue, TRUE) != TokenIdentifier) + ProgramFail(Parser, "case label expected"); + + if (!LexGetToken(Parser, NULL, TRUE) != TokenColon) + ProgramFail(Parser, "':' expected"); + // XXX - implement case + break; + case TokenDefault: - ProgramFail(Parser, "not implemented yet"); + if (!LexGetToken(Parser, NULL, TRUE) != TokenColon) + ProgramFail(Parser, "':' expected"); + // XXX - implement default + break; + + case TokenBreak: + // XXX - implement break + break; + + case TokenContinue: + // XXX - implement continue + break; + + case TokenReturn: + // XXX - implement return break; default: diff --git a/picoc.h b/picoc.h index 39a7409..256c001 100644 --- a/picoc.h +++ b/picoc.h @@ -58,7 +58,7 @@ enum LexToken TokenIncrement, TokenDecrement, TokenIntType, TokenCharType, TokenFloatType, TokenDoubleType, TokenVoidType, TokenEnumType, TokenLongType, TokenSignedType, TokenShortType, TokenStructType, TokenUnionType, TokenUnsignedType, TokenTypedef, - TokenDo, TokenElse, TokenFor, TokenIf, TokenWhile, TokenBreak, TokenSwitch, TokenCase, TokenDefault, TokenReturn, + TokenContinue, TokenDo, TokenElse, TokenFor, TokenIf, TokenWhile, TokenBreak, TokenSwitch, TokenCase, TokenDefault, TokenReturn, TokenHashDefine, TokenHashInclude }; diff --git a/tests/05_array.c b/tests/05_array.c index 4d96616..f722578 100644 --- a/tests/05_array.c +++ b/tests/05_array.c @@ -1,9 +1,9 @@ int Count; int Array[10]; -for (Count = 0; Count < 10; Count++) +for (Count = 1; Count <= 10; Count++) { - Array[Count] = Count * Count; + Array[Count-1] = Count * Count; } for (Count = 0; Count < 10; Count++)