public override object VisitFunctionVariableDeclarationStatement([NotNull] ClepsParser.FunctionVariableDeclarationStatementContext context)
        {
            ClepsVariable variable = Visit(context.variableDeclaration()) as ClepsVariable;

            VariableManager variableManager = VariableManagers.Last();
            if (!variableManager.IsVariableNameAvailable(variable.VariableName))
            {
                string errorMessage = String.Format("Variable {0} is already defined", variable.VariableName);
                Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage));
                //Use a different variable name to avoid stopping the compilation
                string newVariableName = variableManager.GetAvailableVariableName(variable.VariableName);
                variable = new ClepsVariable(newVariableName, variable.VariableType, variable.IsConstant);
            }

            IValue value = null;
            if (context.rightHandExpression() != null)
            {
                value = Visit(context.rightHandExpression()) as IValue;
                if (variable.VariableType != value.ExpressionType)
                {
                    throw new NotImplementedException("Assignment for non identical types not supported yet");
                }
            }

            IValueRegister variableRegister = CurrMethodGenerator.CreateNewVariable(variable, value);
            variableManager.AddLocalVariable(variable, variableRegister);

            return variable;
        }
        public override object VisitFunctionVariableDeclarationStatement([NotNull] ClepsParser.FunctionVariableDeclarationStatementContext context)
        {
            ClepsVariable variable = Visit(context.variableDeclaration()) as ClepsVariable;

            VariableManager variableManager = VariableManagers.Last();

            if (!variableManager.IsVariableNameAvailable(variable.VariableName))
            {
                string errorMessage = String.Format("Variable {0} is already defined", variable.VariableName);
                Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage));
                //Use a different variable name to avoid stopping the compilation
                string newVariableName = variableManager.GetAvailableVariableName(variable.VariableName);
                variable = new ClepsVariable(newVariableName, variable.VariableType, variable.IsConstant);
            }

            IValue value = null;

            if (context.rightHandExpression() != null)
            {
                value = Visit(context.rightHandExpression()) as IValue;
                if (variable.VariableType != value.ExpressionType)
                {
                    throw new NotImplementedException("Assignment for non identical types not supported yet");
                }
            }

            IValueRegister variableRegister = CurrMethodGenerator.CreateNewVariable(variable, value);

            variableManager.AddLocalVariable(variable, variableRegister);

            return(variable);
        }
Beispiel #3
0
 public void AddLocalVariable(ClepsVariable variable, IValueRegister variableRegister)
 {
     Debug.Assert(LocalVariableBlocks.Count > 0 && IsVariableNameAvailable(variable.VariableName));
     LocalVariableBlocks.Last().Add(variable.VariableName, new VariableAndRegister()
     {
         Variable = variable, Register = variableRegister
     });
 }
Beispiel #4
0
        public IValueRegister CreateNewVariable(ClepsVariable variable, IValue initialValue = null)
        {
            string varName = NameGenerator.GetAvailableName(JavaScriptCodeParameters.VARIABLEPREFIX + variable.VariableName, variablesCreated);
            variablesCreated.Add(varName);

            if (initialValue == null)
            {
                AppendFormatLine("var {0};", varName);
            }
            else
            {
                AppendFormatLine("var {0} = {1};", varName, (initialValue as JavaScriptValue).Expression);
            }

            var ret = new JavaScriptRegister(varName, variable.VariableType);
            return ret;
        }
Beispiel #5
0
        public IValueRegister CreateNewVariable(ClepsVariable variable, IValue initialValue = null)
        {
            string varName = NameGenerator.GetAvailableName(JavaScriptCodeParameters.VARIABLEPREFIX + variable.VariableName, variablesCreated);

            variablesCreated.Add(varName);

            if (initialValue == null)
            {
                AppendFormatLine("var {0};", varName);
            }
            else
            {
                AppendFormatLine("var {0} = {1};", varName, (initialValue as JavaScriptValue).Expression);
            }

            var ret = new JavaScriptRegister(varName, variable.VariableType);

            return(ret);
        }
Beispiel #6
0
        public void AddNewMember(bool isStatic, ClepsVariable member)
        {
            string cantAddReason;

            Debug.Assert(CanAddMemberToClass(member.VariableName, member.VariableType, isStatic, out cantAddReason));

            OrderedDictionary <string, ClepsVariable>  variables;
            Dictionary <string, List <ClepsVariable> > methods;

            if (isStatic)
            {
                variables = StaticMemberVariables;
                methods   = StaticMemberMethods;
            }
            else
            {
                variables = MemberVariables;
                methods   = MemberMethods;
            }

            if (member.VariableType.IsFunctionType)
            {
                List <ClepsVariable> functions;
                if (methods.ContainsKey(member.VariableName))
                {
                    functions = methods[member.VariableName];
                }
                else
                {
                    functions = new List <ClepsVariable>();
                    methods[member.VariableName] = functions;
                }

                functions.Add(member);
            }
            else
            {
                variables.Add(member.VariableName, member);
            }
        }
Beispiel #7
0
        public void AddNewMember(bool isStatic, ClepsVariable member)
        {
            string cantAddReason;
            Debug.Assert(CanAddMemberToClass(member.VariableName, member.VariableType, isStatic, out cantAddReason));

            OrderedDictionary<string, ClepsVariable> variables;
            Dictionary<string, List<ClepsVariable>> methods;

            if (isStatic)
            {
                variables = StaticMemberVariables;
                methods = StaticMemberMethods;
            }
            else
            {
                variables = MemberVariables;
                methods = MemberMethods;
            }

            if (member.VariableType.IsFunctionType)
            {
                List<ClepsVariable> functions;
                if(methods.ContainsKey(member.VariableName))
                {
                    functions = methods[member.VariableName];
                }
                else
                {
                    functions = new List<ClepsVariable>();
                    methods[member.VariableName] = functions;
                }

                functions.Add(member);
            }
            else
            {
                variables.Add(member.VariableName, member);
            }           
        }
Beispiel #8
0
 public IValueRegister CreateNewVariable(ClepsVariable variable, IValue initialValue = null)
 {
     throw new NotImplementedException();
 }
Beispiel #9
0
 public IValueRegister CreateNewVariable(ClepsVariable variable, IValue initialValue = null)
 {
     throw new NotImplementedException();
 }