Fixed a bug in parsing "while ()" and "do..while()". I tried to be too clever. Bad idea.

git-svn-id: http://picoc.googlecode.com/svn/trunk@329 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2009-06-04 00:18:28 +00:00
parent 390ff153a1
commit 2a69c48777
6 changed files with 41 additions and 14 deletions

View file

@ -210,7 +210,7 @@ void GenericPrintf(struct ParseState *Parser, struct Value *ReturnValue, struct
struct Value *CharArray; struct Value *CharArray;
char *Str; char *Str;
if (NextArg->Typ == CharPtrType || NextArg->Typ->Base == TypePointer && NextArg->Typ->FromType->Base == TypeArray && NextArg->Typ->FromType->FromType->Base == TypeChar) if (NextArg->Typ == CharPtrType || (NextArg->Typ->Base == TypePointer && NextArg->Typ->FromType->Base == TypeArray && NextArg->Typ->FromType->FromType->Base == TypeChar) )
{ {
CharArray = NextArg->Val->Pointer.Segment; CharArray = NextArg->Val->Pointer.Segment;

View file

@ -89,13 +89,16 @@ void ExpressionStackShow(struct ExpressionStack *StackTop)
switch (StackTop->p.Val->Typ->Base) switch (StackTop->p.Val->Typ->Base)
{ {
case TypeVoid: printf("void"); break; case TypeVoid: printf("void"); break;
case TypeInt: case TypeChar: printf("%d:int", StackTop->p.Val->Val->Integer); break; case TypeInt: printf("%d:int", StackTop->p.Val->Val->Integer); break;
case TypeChar: printf("%d:char", StackTop->p.Val->Val->Character); break;
case TypeFP: printf("%f:fp", StackTop->p.Val->Val->FP); break; case TypeFP: printf("%f:fp", StackTop->p.Val->Val->FP); break;
case TypeFunction: printf("%s:function", StackTop->p.Val->Val->Identifier); break; case TypeFunction: printf("%s:function", StackTop->p.Val->Val->Identifier); break;
case TypeMacro: printf("%s:macro", StackTop->p.Val->Val->Identifier); break; case TypeMacro: printf("%s:macro", StackTop->p.Val->Val->Identifier); break;
case TypePointer: case TypePointer:
if (StackTop->p.Val->Typ->FromType->Base == TypeChar) if (StackTop->p.Val->Val->Pointer.Segment == NULL)
printf("\"%s\":string", (char *)StackTop->p.Val->Val->Pointer.Segment->Val->Array.Data); printf("ptr(NULL)");
else if (StackTop->p.Val->Typ->FromType->Base == TypeChar)
printf("\"%s\":string", (char *)StackTop->p.Val->Val->Pointer.Segment->Val->Array.Data + StackTop->p.Val->Val->Pointer.Offset);
else else
printf("ptr(0x%lx,%d)", (long)StackTop->p.Val->Val->Pointer.Segment, StackTop->p.Val->Val->Pointer.Offset); printf("ptr(0x%lx,%d)", (long)StackTop->p.Val->Val->Pointer.Segment, StackTop->p.Val->Val->Pointer.Offset);
break; break;
@ -786,7 +789,7 @@ void ExpressionStackCollapse(struct ParseState *Parser, struct ExpressionStack *
struct ExpressionStack *TopStackNode = *StackTop; struct ExpressionStack *TopStackNode = *StackTop;
struct ExpressionStack *TopOperatorNode; struct ExpressionStack *TopOperatorNode;
debugf("ExpressionStackCollapse():\n"); debugf("ExpressionStackCollapse(%d):\n", Precedence);
#ifdef DEBUG_EXPRESSIONS #ifdef DEBUG_EXPRESSIONS
ExpressionStackShow(*StackTop); ExpressionStackShow(*StackTop);
#endif #endif

28
parse.c
View file

@ -257,7 +257,8 @@ enum RunMode ParseBlock(struct ParseState *Parser, int AbsorbOpenBrace, int Cond
ProgramFail(Parser, "'{' expected"); ProgramFail(Parser, "'{' expected");
if (Parser->Mode != RunModeSkip && !Condition) if (Parser->Mode != RunModeSkip && !Condition)
{ /* condition failed - skip this block instead */ {
/* condition failed - skip this block instead */
enum RunMode OldMode = Parser->Mode; enum RunMode OldMode = Parser->Mode;
Parser->Mode = RunModeSkip; Parser->Mode = RunModeSkip;
while (ParseStatement(Parser) == ParseResultOk) while (ParseStatement(Parser) == ParseResultOk)
@ -265,7 +266,8 @@ enum RunMode ParseBlock(struct ParseState *Parser, int AbsorbOpenBrace, int Cond
Parser->Mode = OldMode; Parser->Mode = OldMode;
} }
else else
{ /* just run it in its current mode */ {
/* just run it in its current mode */
while (ParseStatement(Parser) == ParseResultOk) while (ParseStatement(Parser) == ParseResultOk)
{} {}
} }
@ -328,12 +330,21 @@ enum ParseResult ParseStatement(struct ParseState *Parser)
case TokenWhile: case TokenWhile:
{ {
struct ParseState PreConditional; struct ParseState PreConditional;
if (LexGetToken(Parser, NULL, TRUE) != TokenOpenBracket)
ProgramFail(Parser, "'(' expected");
ParserCopyPos(&PreConditional, Parser); ParserCopyPos(&PreConditional, Parser);
do do
{ {
ParserCopyPos(Parser, &PreConditional); ParserCopyPos(Parser, &PreConditional);
Condition = ExpressionParseInt(Parser); Condition = ExpressionParseInt(Parser);
ParseBlock(Parser, TRUE, Condition); if (LexGetToken(Parser, NULL, TRUE) != TokenCloseBracket)
ProgramFail(Parser, "')' expected");
if (ParseStatementMaybeRun(Parser, Condition) != ParseResultOk)
ProgramFail(Parser, "statement expected");
if (Parser->Mode == RunModeContinue) if (Parser->Mode == RunModeContinue)
Parser->Mode = RunModeRun; Parser->Mode = RunModeRun;
@ -353,15 +364,22 @@ enum ParseResult ParseStatement(struct ParseState *Parser)
do do
{ {
ParserCopyPos(Parser, &PreStatement); ParserCopyPos(Parser, &PreStatement);
ParseBlock(Parser, TRUE, TRUE); if (ParseStatement(Parser) != ParseResultOk)
ProgramFail(Parser, "statement expected");
if (Parser->Mode == RunModeContinue) if (Parser->Mode == RunModeContinue)
Parser->Mode = RunModeRun; Parser->Mode = RunModeRun;
if (LexGetToken(Parser, NULL, TRUE) != TokenWhile) if (LexGetToken(Parser, NULL, TRUE) != TokenWhile)
ProgramFail(Parser, "'while' expected"); ProgramFail(Parser, "'while' expected");
if (LexGetToken(Parser, NULL, TRUE) != TokenOpenBracket)
ProgramFail(Parser, "'(' expected");
Condition = ExpressionParseInt(Parser); Condition = ExpressionParseInt(Parser);
if (LexGetToken(Parser, NULL, TRUE) != TokenCloseBracket)
ProgramFail(Parser, "')' expected");
} while (Condition && Parser->Mode == RunModeRun); } while (Condition && Parser->Mode == RunModeRun);
if (Parser->Mode == RunModeBreak) if (Parser->Mode == RunModeBreak)

View file

@ -13,11 +13,9 @@ for (b = a; *b != 0; b++)
printf("%c: %d\n", *b, *b); printf("%c: %d\n", *b, *b);
char destarray[10]; char destarray[10];
char *dest; char *dest = &destarray[0];
char *src; char *src = a;
dest = &destarray[0];
src = a;
while (*src != 0) while (*src != 0)
*dest++ = *src++; *dest++ = *src++;

View file

@ -0,0 +1,7 @@
hello
h: 104
e: 101
l: 108
l: 108
o: 111
copied string is hello

View file

@ -19,6 +19,7 @@ TESTS= 00_assignment.test \
18_include.test \ 18_include.test \
19_pointer_arithmetic.test \ 19_pointer_arithmetic.test \
20_pointer_comparison.test \ 20_pointer_comparison.test \
21_char_array.test \
22_floating_point.test \ 22_floating_point.test \
23_type_coercion.test \ 23_type_coercion.test \
24_math_library.test \ 24_math_library.test \