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

View file

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

26
parse.c
View file

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

View file

@ -13,11 +13,9 @@ for (b = a; *b != 0; b++)
printf("%c: %d\n", *b, *b);
char destarray[10];
char *dest;
char *src;
char *dest = &destarray[0];
char *src = a;
dest = &destarray[0];
src = a;
while (*src != 0)
*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 \
19_pointer_arithmetic.test \
20_pointer_comparison.test \
21_char_array.test \
22_floating_point.test \
23_type_coercion.test \
24_math_library.test \