private AST foreachStuff(string pLoopVariableName)
{
AST statementList = new AST(new Token(Token.TokenType.STATEMENT_LIST, "<FOREACH_STATEMENTS>"));
// increase __index__
AST incrementNode = new AST(new Token(Token.TokenType.OPERATOR, "+"));
incrementNode.addChild(new AST(new Token(Token.TokenType.NAME, "__index__")));
incrementNode.addChild(new AST(new TokenWithValue(Token.TokenType.NUMBER, "1", 1.0f)));
AST_Assignment assignmentNode = new AST_Assignment(new Token(Token.TokenType.ASSIGNMENT, "="), "__index__");
assignmentNode.addChild(incrementNode);
statementList.addChild(assignmentNode);
// if(__index__ >= count(__indexes__)) { break }
AST_FunctionCall lengthOfArray = new AST_FunctionCall(new Token(Token.TokenType.FUNCTION_CALL, "Count"));
AST argumentList = new AST(new Token(Token.TokenType.NODE_GROUP, "<ARGUMENT_LIST>"));
argumentList.addChild(new Token(Token.TokenType.NAME, "__indexes__"));
lengthOfArray.addChild(argumentList);
AST breakStatement = new AST_IfNode(new Token(Token.TokenType.IF, "IF"));
AST operatorTree = new AST(new Token(Token.TokenType.OPERATOR, ">="));
operatorTree.addChild(new Token(Token.TokenType.NAME, "__index__"));
operatorTree.addChild(lengthOfArray);
breakStatement.addChild(operatorTree);
breakStatement.addChild(new Token(Token.TokenType.BREAK, "break"));
statementList.addChild(breakStatement);
// Loop variable
AST_VariableDeclaration declarationTree =
new AST_VariableDeclaration(new Token(Token.TokenType.VAR_DECLARATION, "<VAR_DECL>"), ReturnValueType.UNKNOWN_TYPE, pLoopVariableName);
statementList.addChild(declarationTree);
AST arrayIndexLookup = new AST(new Token(Token.TokenType.ARRAY_LOOKUP, "__indexes__"));
arrayIndexLookup.addChild(new AST(new Token(Token.TokenType.NAME, "__index__")));
AST arrayValueLookup = new AST(new Token(Token.TokenType.ARRAY_LOOKUP, "__array__"));
arrayValueLookup.addChild(arrayIndexLookup);
AST_Assignment assignmentTree =
new AST_Assignment(new Token(Token.TokenType.ASSIGNMENT, "="), pLoopVariableName);
assignmentTree.addChild(arrayValueLookup);
statementList.addChild(assignmentTree);
return statementList;
}