Skip to content

Commit

Permalink
Assignment to unsized array from array initialisers is implemented.
Browse files Browse the repository at this point in the history
  • Loading branch information
zik.saleeba committed Sep 6, 2012
1 parent fdfbcb2 commit 95e7c07
Showing 1 changed file with 55 additions and 30 deletions.
85 changes: 55 additions & 30 deletions parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,46 +178,71 @@ struct Value *ParseFunctionDefinition(struct ParseState *Parser, struct ValueTyp
return FuncValue;
}

/* assign an initial value to a variable */
void ParseDeclarationAssignment(struct ParseState *Parser, struct Value *NewVariable, int DoAssignment)
/* parse an array initialiser and assign to a variable */
int ParseArrayInitialiser(struct ParseState *Parser, struct Value *NewVariable, int DoAssignment)
{
struct Value *CValue;
int ArrayIndex;
enum LexToken Token = TokenComma;

if (LexGetToken(Parser, NULL, FALSE) == TokenLeftBrace)
struct Value *CValue;

/* count the number of elements in the array */
if (DoAssignment && Parser->Mode == RunModeRun)
{
/* this is an array initialiser */
LexGetToken(Parser, NULL, TRUE);
struct ParseState CountParser;
int NumElements;

for (ArrayIndex = 0; (Parser->Mode != RunModeRun && Token == TokenComma) || (Parser->Mode == RunModeRun && ArrayIndex < NewVariable->Typ->ArraySize); ArrayIndex++)
{
struct Value *ArrayElement = NULL;
ParserCopy(&CountParser, Parser);
NumElements = ParseArrayInitialiser(&CountParser, NewVariable, FALSE);
if (NewVariable->Typ->ArraySize == 0)
VariableRealloc(Parser, NewVariable, NumElements);

else if (NewVariable->Typ->ArraySize != NumElements)
AssignFail(Parser, "from an array of size %d to one of size %d", NULL, NULL, NumElements, NewVariable->Typ->ArraySize, NULL, 0);
}

/* parse the array initialiser */
for (ArrayIndex = 0; Token == TokenComma; ArrayIndex++)
{
struct Value *ArrayElement = NULL;

if (Token != TokenComma)
ProgramFail(Parser, "comma expected");

if (Token != TokenComma)
ProgramFail(Parser, "comma expected");

if (Parser->Mode == RunModeRun)
ArrayElement = VariableAllocValueFromExistingData(Parser, NewVariable->Typ->FromType, (union AnyValue *)(&NewVariable->Val->ArrayMem[0] + TypeSize(NewVariable->Typ->FromType, 0, TRUE) * ArrayIndex), TRUE, NewVariable);

if (!ExpressionParse(Parser, &CValue))
ProgramFail(Parser, "expression expected");

if (Parser->Mode == RunModeRun && DoAssignment)
{
ExpressionAssign(Parser, ArrayElement, CValue, FALSE, NULL, 0, FALSE);
VariableStackPop(Parser, CValue);
VariableStackPop(Parser, ArrayElement);
}
if (Parser->Mode == RunModeRun && DoAssignment)
ArrayElement = VariableAllocValueFromExistingData(Parser, NewVariable->Typ->FromType, (union AnyValue *)(&NewVariable->Val->ArrayMem[0] + TypeSize(NewVariable->Typ->FromType, 0, TRUE) * ArrayIndex), TRUE, NewVariable);

Token = LexGetToken(Parser, NULL, TRUE);
if (!ExpressionParse(Parser, &CValue))
ProgramFail(Parser, "expression expected");

if (Parser->Mode == RunModeRun && DoAssignment)
{
ExpressionAssign(Parser, ArrayElement, CValue, FALSE, NULL, 0, FALSE);
VariableStackPop(Parser, CValue);
VariableStackPop(Parser, ArrayElement);
}

if (Token == TokenComma)
Token = LexGetToken(Parser, NULL, TRUE);
Token = LexGetToken(Parser, NULL, TRUE);
}

if (Token == TokenComma)
Token = LexGetToken(Parser, NULL, TRUE);

if (Token != TokenRightBrace)
ProgramFail(Parser, "'}' expected");

return ArrayIndex;
}

/* assign an initial value to a variable */
void ParseDeclarationAssignment(struct ParseState *Parser, struct Value *NewVariable, int DoAssignment)
{
struct Value *CValue;

if (Token != TokenRightBrace)
ProgramFail(Parser, "'}' expected");
if (LexGetToken(Parser, NULL, FALSE) == TokenLeftBrace)
{
/* this is an array initialiser */
LexGetToken(Parser, NULL, TRUE);
ParseArrayInitialiser(Parser, NewVariable, DoAssignment);
}
else
{
Expand Down

0 comments on commit 95e7c07

Please sign in to comment.