public static FunctionDeclaration FunctionDeclaration( this Random random, IReadOnlyCollection <FunctionDeclaration> decFuns, int maxStatementsPerFunction, bool isMain = false) { var numStatements = random.Next(1, maxStatementsPerFunction); var statements = new List <IStatement>(); var decVars = new List <Variable>(); // Add variable for argument if (!isMain) { decVars.Add(new Variable("p", true)); } // Variable declaration to start off every function // If possible, used the last function declaration to ensure all are used var firstDecVar = decFuns.Any() ? new VariableDeclaration( new Variable($"x{decVars.Count}"), new FunctionCall( decFuns.Last().FunctionName, new Literal(random.Next(0, 100)))) : random.VariableDeclaration(decVars, decFuns); statements.Add(firstDecVar); decVars.Add(firstDecVar.Variable); // Random statements for (var _ = 0; _ < numStatements; _ += 1) { if (random.TrueOrFalse()) { var decVar = random.VariableDeclaration(decVars, decFuns); statements.Add(decVar); decVars.Add(decVar.Variable); } else { var assignment = random.Assignment(decVars, decFuns); statements.Add(assignment); } } if (isMain) { var m = random.MainVariableDeclaration(decVars, decFuns); statements.Add(m); statements.Add(new Print(m.Variable)); statements.Add(new Return(new Literal(0))); return(new MainFunctionDeclaration($"main", statements)); } else { statements.Add(random.Return(decVars, decFuns)); return(new FunctionDeclaration($"f{decFuns.Count}", statements)); } }