public override IMethodValue VisitFunctionAssignment_Ex([NotNull] ClepsParser.FunctionAssignmentContext context)
        {
            var             oldCurrMethodRegister = CurrMethodGenerator;
            VariableManager variableManager       = new VariableManager();

            VariableManagers.Add(variableManager);

            ClepsType returnType = VoidClepsType.GetVoidType();

            if (context.FunctionReturnType != null)
            {
                returnType = Visit(context.FunctionReturnType) as ClepsType;
            }

            List <ClepsVariable> functionParameters = context._FunctionParameters.Select(p => Visit(p) as ClepsVariable).ToList();

            FunctionClepsType functionType = new FunctionClepsType(functionParameters.Select(p => p.VariableType).ToList(), returnType);

            var newMethod = CodeGenerator.CreateNewMethod(functionType);

            CurrMethodGenerator = newMethod;

            CurrMethodGenerator.SetFormalParameterNames(functionParameters.Select(p => p.VariableName).ToList());

            functionParameters.ForEach(variable => {
                variableManager.AddLocalVariable(variable, CurrMethodGenerator.GetFormalParameterRegister(variable.VariableName));
            });

            Visit(context.statementBlock());

            VariableManagers.RemoveAt(VariableManagers.Count - 1);
            CurrMethodGenerator = oldCurrMethodRegister;
            return(newMethod);
        }
        public override object VisitFunctionAssignment_Ex([NotNull] ClepsParser.FunctionAssignmentContext context)
        {
            VariableManager variableManager = new VariableManager();

            VariableManagers.Add(variableManager);

            ClepsType returnType = VoidType.GetVoidType();

            if (context.FunctionReturnType != null)
            {
                returnType = Visit(context.FunctionReturnType) as ClepsType;
            }

            List <ClepsType>  parameterTypes = context._FunctionParameterTypes.Select(t => Visit(context.FunctionReturnType) as ClepsType).ToList();
            FunctionClepsType functionType   = new FunctionClepsType(parameterTypes, returnType);

            IMethodRegister methodRegister       = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName);
            var             formalParameterNames = context._FormalParameters.Select(p => Visit(p) as string).ToList();

            methodRegister.SetFormalParameterNames(formalParameterNames);

            formalParameterNames.Zip(parameterTypes, (name, clepsType) => new ClepsVariable(name, clepsType))
            .ToList().ForEach(variable =>
            {
                variableManager.AddLocalVariable(variable, methodRegister.GetFormalParameterRegister(variable.VariableName));
            });

            Visit(context.statementBlock());
            VariableManagers.RemoveAt(VariableManagers.Count - 1);
            return(functionType);
        }
        public sealed override object VisitFunctionAssignment([NotNull] ClepsParser.FunctionAssignmentContext context)
        {
            var oldCurrentBlockStatus = CurrentBlockStatus;

            CurrentBlockStatus = new List <StatementBlockStatus>()
            {
                new StatementBlockStatus(StatementBlockSource.Function)
            };

            FunctionClepsType functionType = VisitFunctionAssignment_Ex(context) as FunctionClepsType;

            if (functionType.ReturnType != VoidType.GetVoidType() && !CurrentBlockStatus.Last().ReturnStatementReached)
            {
                string errorMessage = "Not all pathways have return statements";
                Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage));
            }

            CurrentBlockStatus = oldCurrentBlockStatus;

            return(true);
        }
Esempio n. 4
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="ClepsParser.functionAssignment"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitFunctionAssignment([NotNull] ClepsParser.FunctionAssignmentContext context)
 {
 }
Esempio n. 5
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="ClepsParser.functionAssignment"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitFunctionAssignment([NotNull] ClepsParser.FunctionAssignmentContext context)
 {
     return(VisitChildren(context));
 }
Esempio n. 6
0
 public virtual IMethodValue VisitFunctionAssignment_Ex([NotNull] ClepsParser.FunctionAssignmentContext context)
 {
     return(VisitChildren(context) as IMethodValue);
 }