Example #1
0
        public expression_node visit(SyntaxTree.expression expr)
        {
            expr.visit(syntax_tree_visitor);

            /*addressed_expression ad = ret_semantic as addressed_expression;
             * if (ad != null && ad.is_addressed)
             * {
             *  if (convertion_data_and_alghoritms.check_for_constant(ad))
             *      ad.is_addressed = false;
             * }*/

            //Надеюсь, это сильно не скажется на производительности, хотя в другом случае этот же код просто будет разбросан по всем метдам syntax_tree_visitor-а.
            base_function_call bfc = ret_semantic as base_function_call;

            if (bfc != null)
            {
                if (bfc.simple_function_node.compile_time_executor != null)
                {
                    expression_node ex = bfc.simple_function_node.compile_time_executor(bfc.location, bfc.parameters.ToArray());
                    if (ex != null)
                    {
                        return(ex);
                    }
                }
            }

            return(ret_semantic as expression_node);
        }
        public void semantic_check_loop_stmt(SyntaxTree.expression ex)
        {
            var sem_ex = convert_strong(ex);
            var b      = convertion_data_and_alghoritms.can_convert_type(sem_ex, SystemLibrary.SystemLibrary.integer_type);

            if (!b)
            {
                AddError(sem_ex.location, "INTEGER_VALUE_EXPECTED");
            }
        }
        void semantic_check_for_indices(SyntaxTree.expression expr)
        {
            // Надо проверить, что expr - это одноразмерный массив или список. Эта проверка была в visit(foreach)
            var semexpr = convert_strong(expr);
            var Is1DArr = Is1DArray(semexpr);
            var il      = IsIList(semexpr);

            if (!Is1DArr && !il)
            {
                AddError(get_location(expr), "ONE_DIM_ARRAY_OR_LIST_EXPECTED");
            }
        }
Example #4
0
        void semantic_check_for_indices(SyntaxTree.expression expr)
        {
            // Надо проверить, что expr - это одноразмерный массив или список. Эта проверка была в visit(foreach)
            var semexpr = convert_strong(expr);
            var Is1DArr = Is1DArray(semexpr);
            var il      = IsIList(semexpr);

            // Тут может быть другая ситуация - Indices может быть членом semexpr - и тогда нельзя преобразовывать
            if (!Is1DArr && !il)
            {
                AddError(get_location(expr), "ONE_DIM_ARRAY_OR_LIST_EXPECTED");
            }
        }
        public void semantic_check_slice_assignment_types(SyntaxTree.expression expr1, SyntaxTree.expression expr2, method_call mc)
        {
            var slice      = expr1 as slice_expr;
            var leftValue  = convert_strong(slice.v);
            var leftType   = leftValue.type;
            var rightValue = convert_strong(expr2);
            var rightType  = rightValue.type;

            var        v    = slice.v;
            var        from = mc.parameters.expressions[2] as expression;
            var        to   = mc.parameters.expressions[3] as expression;
            expression step = mc.parameters.expressions.Count > 4 ? mc.parameters.expressions[4] : null;

            var semvar = convert_strong(v);

            if (semvar is typed_expression)
            {
                semvar = convert_typed_expression_to_function_call(semvar as typed_expression);
            }

            var IsSlicedType = 0; // проверим, является ли semvar.type динамическим массивом, списком List или строкой

            if (semvar.type.type_special_kind == SemanticTree.type_special_kind.array_kind)
            {
                IsSlicedType = 1;
            }

            if (IsSlicedType == 0)
            {
                var t = ConvertSemanticTypeNodeToNETType(semvar.type); // не работает для array of T

                // semvar.type должен быть array of T, List<T> или string
                if (t == null)
                {
                    IsSlicedType = 0; // можно ничего не присваивать :)
                }
                //                else if (t.IsArray)
                //                  IsSlicedType = 1;
                else if (t == typeof(System.String))
                {
                    IsSlicedType = 2;
                }
                else if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(System.Collections.Generic.List <>))
                {
                    IsSlicedType = 3;
                }
            }

            if (IsSlicedType == 0)
            {
                AddError(get_location(v), "BAD_SLICE_OBJECT");
            }

            var semfrom     = convert_strong(from);
            var fromIsIndex = (semfrom is common_constructor_call fromCall) &&
                              fromCall.common_type.comprehensive_namespace.namespace_full_name.Equals("PABCSystem") &&
                              fromCall.common_type.PrintableName.Equals("SystemIndex");
            var b = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.integer_type);

            if (!b && !fromIsIndex)
            {
                AddError(get_location(from), "INTEGER_VALUE_EXPECTED");
            }

            var semto     = convert_strong(to);
            var toIsIndex = (semto is common_constructor_call toCall) &&
                            toCall.common_type.comprehensive_namespace.namespace_full_name.Equals("PABCSystem") &&
                            toCall.common_type.PrintableName.Equals("SystemIndex");

            b = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type);
            if (!b && !toIsIndex)
            {
                AddError(get_location(to), "INTEGER_VALUE_EXPECTED");
            }

            if (step != null)
            {
                var semstep = convert_strong(step);
                b = convertion_data_and_alghoritms.can_convert_type(semstep, SystemLibrary.SystemLibrary.integer_type);
                if (!b)
                {
                    AddError(get_location(step), "INTEGER_VALUE_EXPECTED");
                }
            }

            if (!AreTheSameType(leftType, rightType))
            {
                AddError(get_location(expr2), "EXPRESSION_OF_TYPE_{0}_CANNOT_BE_ASSIGNED_TO_SLICE_OF_TYPE_{1}", rightType.PrintableName, leftType.PrintableName);
            }
        }