Syntax of "switch" is now handled. Not semantics though.

git-svn-id: http://picoc.googlecode.com/svn/trunk@81 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2009-02-17 23:36:09 +00:00
parent 2e545deb6a
commit d94b70212b
4 changed files with 49 additions and 6 deletions

1
lex.c
View file

@ -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 },

48
parse.c
View file

@ -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:

View file

@ -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
};

View file

@ -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++)