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:
parent
390ff153a1
commit
2a69c48777
|
@ -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;
|
||||||
|
|
||||||
|
|
11
expression.c
11
expression.c
|
@ -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
28
parse.c
|
@ -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)
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
||||||
|
|
7
tests/21_char_array.expect
Normal file
7
tests/21_char_array.expect
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
hello
|
||||||
|
h: 104
|
||||||
|
e: 101
|
||||||
|
l: 108
|
||||||
|
l: 108
|
||||||
|
o: 111
|
||||||
|
copied string is hello
|
|
@ -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 \
|
||||||
|
|
Loading…
Reference in a new issue