예제 #1
0
        public override int VisitVariableedit([NotNull] CBluntParser.VariableeditContext context)
        {
#if DEBUG
            Console.WriteLine("VisitVariableedit");
#endif
            this.AddText(context.ID().GetText());
            Visit(context.equals());
            Visit(context.expression());
            return(0);
        }
예제 #2
0
        public override int VisitVariableedit([NotNull] CBluntParser.VariableeditContext context)
        {
#if DEBUG
            Console.WriteLine("VisitVariableedit");
#endif
            // The name of the variable
            var variableName = context.ID().GetText();

            // The operator type (For example: = += /= so on)
            var operatorType = context.equals().GetText();

            // The assignment value
            var assignmentValue = context.expression().GetText();

            /// TODO: USE UTILITY METHOD

            // First iterate over the current scope and all previous scopes
            var currNode = SymbolTable.MethodScopeLinkedList.Last;

            // The properties of the variable we found
            VariableProperties variableProperties = null;

            variableProperties = GetDeclaredVariable(variableName);

            if (variableProperties == null)
            {
                SyntaxError(context, "Variable with name " + variableName + " cannot be assigned a value as it does not exist");
                return(1);
            }

            // Get the expected assignment value, aka the value we expect the variable to be assigned
            SymbolTable.ExpressionStoreLinkedList.AddLast(new ExpressionStore());

            Visit(context.expression());

            // Set assignment type from expression, compare it against operator type
            var assignmentType = SymbolTable.ExpressionStoreLinkedList.Last.Value.Type;

            SymbolTable.ExpressionStoreLinkedList.RemoveLast();

            switch (operatorType)
            {
            // Always allow default assignment
            case "=":
                break;

            case "+=":
                if (assignmentType != "number")
                {
                    SyntaxError(context, "Cannot use addition assignment operator on a type " + assignmentType);
                    return(1);
                }
                break;

            case "-=":
                if (assignmentType != "number")
                {
                    SyntaxError(context, "Cannot use subtraction assignment operator on a type " + assignmentType);
                    return(1);
                }
                break;

            case "*=":
                if (assignmentType != "number")
                {
                    SyntaxError(context, "Cannot use multiplication assignment operator on a type " + assignmentType);
                    return(1);
                }
                break;

            case "/=":
                if (assignmentType != "number")
                {
                    SyntaxError(context, "Cannot use division assignment operator on a type " + assignmentType);
                    return(1);
                }
                break;
            }

            // Now test if this variable's type is the type we are trying to assign
            if (variableProperties.Type != assignmentType)
            {
                SyntaxError(context, "Variable " + variableName + " is of type " + variableProperties.Type + ", cannot assign it a value of type " + assignmentType);
                return(1);
            }

            // If all checks passes, the variable will also be initialized
            variableProperties.Initialized = true;

            return(0);
        }