Implemented array lookup
git-svn-id: http://picoc.googlecode.com/svn/trunk@79 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
038431067f
commit
78e0ff8bc1
11
TODO
11
TODO
|
@ -1,24 +1,13 @@
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
* struct
|
|
||||||
* pointers
|
* pointers
|
||||||
* switch
|
* switch
|
||||||
* arrays
|
|
||||||
* operator precedence
|
* operator precedence
|
||||||
* enum
|
* enum
|
||||||
* interactive mode
|
* interactive mode
|
||||||
|
|
||||||
New type system:
|
|
||||||
* basic types: picoc int, picoc char, native int, native char
|
|
||||||
* structs
|
|
||||||
* arrays of picoc types or structs
|
|
||||||
* pointers to:
|
|
||||||
|
|
||||||
|
|
||||||
Also:
|
Also:
|
||||||
* Change function store system to use dynamic allocation
|
|
||||||
* Check for Alloc returns checking NULL
|
|
||||||
* Do we really need OnHeap? Isn't every value on the stack anyway?
|
* Do we really need OnHeap? Isn't every value on the stack anyway?
|
||||||
* Remove Var parameter from HeapPopStack() once we're certain it all works
|
* Remove Var parameter from HeapPopStack() once we're certain it all works
|
||||||
* Allocating a variable on the heap isn't correct since we need the struct Value to be on the stack anyway
|
|
||||||
|
|
||||||
|
|
23
parse.c
23
parse.c
|
@ -193,6 +193,25 @@ int ParseValue(struct ParseState *Parser, struct Value **Result, int ResultOnHea
|
||||||
(*Result)->Val->Integer--;
|
(*Result)->Val->Integer--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (Token == TokenLeftSquareBracket)
|
||||||
|
{ /* array access */
|
||||||
|
LexGetToken(Parser, &LexValue, TRUE);
|
||||||
|
IntValue = ParseIntExpression(Parser, RunIt);
|
||||||
|
if (LexGetToken(Parser, &LexValue, TRUE) != TokenRightSquareBracket)
|
||||||
|
ProgramFail(Parser, "expected ']'");
|
||||||
|
|
||||||
|
if (RunIt)
|
||||||
|
{ /* look up the array element */
|
||||||
|
if ((*Result)->Typ->Base != TypeArray)
|
||||||
|
ProgramFail(Parser, "not an array");
|
||||||
|
|
||||||
|
if (IntValue < 0 || IntValue >= (*Result)->Typ->ArraySize)
|
||||||
|
ProgramFail(Parser, "illegal array index");
|
||||||
|
|
||||||
|
VariableStackPop(Parser, *Result);
|
||||||
|
LocalLValue = VariableAllocValueFromExistingData(Parser, (*Result)->Typ->FromType, (union AnyValue *)((void *)(&(*Result)->Val) + (*Result)->Typ->FromType->Sizeof * IntValue), TRUE, ResultOnHeap);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -296,7 +315,7 @@ int ParseExpression(struct ParseState *Parser, struct Value **Result, int Result
|
||||||
if (RunIt)
|
if (RunIt)
|
||||||
{
|
{
|
||||||
if (CurrentValue->Typ->Base == TypeFP || TotalValue->Typ->Base == TypeFP)
|
if (CurrentValue->Typ->Base == TypeFP || TotalValue->Typ->Base == TypeFP)
|
||||||
{
|
{ /* floating point expression */
|
||||||
double FPTotal, FPCurrent, FPResult;
|
double FPTotal, FPCurrent, FPResult;
|
||||||
|
|
||||||
if (CurrentValue->Typ->Base != TypeFP || TotalValue->Typ->Base != TypeFP)
|
if (CurrentValue->Typ->Base != TypeFP || TotalValue->Typ->Base != TypeFP)
|
||||||
|
@ -336,7 +355,7 @@ int ParseExpression(struct ParseState *Parser, struct Value **Result, int Result
|
||||||
TotalValue = ParsePushFP(Parser, ResultOnHeap, FPResult);
|
TotalValue = ParsePushFP(Parser, ResultOnHeap, FPResult);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{ /* integer expression */
|
||||||
int IntX, IntY, IntResult;
|
int IntX, IntY, IntResult;
|
||||||
|
|
||||||
if (CurrentValue->Typ->Base != TypeInt || TotalValue->Typ->Base != TypeInt)
|
if (CurrentValue->Typ->Base != TypeInt || TotalValue->Typ->Base != TypeInt)
|
||||||
|
|
Loading…
Reference in a new issue