예제 #1
0
        /// <summary>
        /// Временный узел, который используется при выведении типов параметров
        /// </summary>
        /// <param name="def"></param>
        /// <param name="visitor"></param>
        /// <returns></returns>
        public static typed_expression GetTempFunctionNodeForTypeInference(SyntaxTree.function_lambda_definition def, syntax_tree_visitor visitor)
        {
            var res = new common_namespace_function_node(def.lambda_name, visitor.get_location(def), null, null);

            if (def.return_type != null)
            {
                res.return_value_type = visitor.convert_strong(def.return_type);
            }
            else
            {
                res.return_value_type = null;
            }
            res.parameters.clear();
            if (def.formal_parameters != null && def.formal_parameters.params_list.Count != 0)
            {
                for (int i = 0; i < def.formal_parameters.params_list.Count; i++)
                {
                    var tt = visitor.convert_strong(def.formal_parameters.params_list[i].vars_type); // SSM 29/12/18
                    for (int j = 0; j < def.formal_parameters.params_list[i].idents.idents.Count; j++)
                    {
                        var new_param = new common_parameter(null, SemanticTree.parameter_type.value, res, concrete_parameter_type.cpt_none, visitor.get_location(def.formal_parameters.params_list[i].idents.idents[0]));
                        new_param.type = tt;
                        res.parameters.AddElement(new_param);
                    }
                }
            }
            var hhh = new delegated_methods();

            hhh.proper_methods.AddElement(new common_namespace_function_call(res, visitor.get_location(def)));
            return(new typed_expression(hhh, visitor.get_location(def)));
        }
예제 #2
0
        // !Patterns

        public override void visit(assign assignment)
        {
            var to   = assignment.to as ident;
            var from = assignment.from;

            if (to != null &&
                assignment.operator_type == Operators.Assignment &&
                to.name.ToLower() == RESULT_KEY_WORD)
            {
                var converted = syntaxTreeVisitor.convert_strong(from);
                if (converted is typed_expression)
                {
                    delegated_methods dm = converted.type as delegated_methods;
                    if (dm.empty_param_method != null)
                    {
                        converted = syntaxTreeVisitor.convert_typed_expression_to_function_call(converted as typed_expression);
                    }
                }
                resultExpressionsTypes.Add(new Tuple <type_node, expression, expression_node>(converted.type, from, converted));
                var si_list = syntaxTreeVisitor.context.find(RESULT_KEY_WORD);
                if (si_list != null && si_list.Count > 0 && si_list[0].sym_info == null)
                {
                    si_list[0].sym_info = new local_variable(RESULT_KEY_WORD, converted.type, syntaxTreeVisitor.context.top_function, null);
                }
            }
        }