Exemple #1
0
        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));
            }
        }