コード例 #1
0
        public statement_list CreateStatementList(params statement[] stmts)
        {
            statement_list res = new statement_list();

            foreach (statement x in stmts)
            {
                res.Add(x);
            }
            return(res);
        }
コード例 #2
0
        public static statement_list BuildSimpleAssignList(List <ident> lnames, List <ident> rnames)
        {
            var sl = new statement_list();

            for (int i = 0; i < lnames.Count; i++)
            {
                sl.Add(new assign(lnames[i], rnames[i]));
            }
            return(sl);
        }
コード例 #3
0
 public CapturedVariablesInfo BuildTree(statement_list statementList)
 {
     return(new CapturedVariablesInfo
     {
         RootNode = BuildTreeForStatementList(statementList),
         IdentsReferences = _identsReferences,
         CapturedVarsNodesDictionary = _scopesCapturedVarsNodesDictionary,
         ProcedureScope = _procedureScope
     });
 }
コード例 #4
0
        private void get_with_statement(statement_list sl, ICSharpCode.NRefactory.Ast.WithStatement stmt)
        {
            with_statement with_stmt = new with_statement();

            with_stmt.source_context         = get_source_context(stmt);
            with_stmt.do_with                = new expression_list();
            with_stmt.do_with.source_context = get_source_context(stmt.Expression);
            with_stmt.do_with.expressions.Add(get_expression(stmt.Expression));
            with_stmt.what_do = get_statement_list(stmt.Body);
            sl.subnodes.Add(with_stmt);
        }
コード例 #5
0
 public override void visit(statement_list _statement_list)
 {
     if (is_begin(_statement_list))
     {
         AddPossibleComments(_statement_list, true, false);
     }
     foreach (statement stmt in _statement_list.subnodes)
     {
         stmt.visit(this);
     }
 }
コード例 #6
0
		public override void visit(statement_list _statement_list)
		{
			executer.visit(_statement_list);
			if (_statement_list.subnodes != null)
			foreach (dynamic x in _statement_list.subnodes)
				if(x != null)
					this.visit(x);
			if (_statement_list.left_logical_bracket != null)
				this.visit((dynamic)_statement_list.left_logical_bracket);
			if (_statement_list.right_logical_bracket != null)
				this.visit((dynamic)_statement_list.right_logical_bracket);
			if (_statement_list.attributes != null)
				this.visit((dynamic)_statement_list.attributes);
		}
コード例 #7
0
 private void get_var_statement(statement_list sl, ICSharpCode.NRefactory.Ast.LocalVariableDeclaration var)
 {
     foreach (ICSharpCode.NRefactory.Ast.VariableDeclaration vd in var.Variables)
     {
         var_def_statement vds = new var_def_statement();
         vds.source_context = get_source_context(var);
         vds.vars_type      = get_type_reference(vd.TypeReference);
         ident_list idents = new ident_list();
         ident      name   = new ident(vd.Name);
         name.source_context = get_source_context(var);
         idents.idents.Add(name);
         vds.vars = idents;
         sl.subnodes.Add(new var_statement(vds));
     }
 }
コード例 #8
0
        public statement_list NewLambdaBody(expression expr_l1, LexLocation loc)
        {
            var sl = new statement_list();

            sl.expr_lambda_body = true;
            var id = new ident("result");
            var op = new op_type_node(Operators.Assignment);
            //_op_type_node.source_context = parsertools.GetTokenSourceContext();
            var ass = new assign(id, expr_l1, op.type);

            parsertools.create_source_context(ass, id, expr_l1);
            sl.subnodes.Add(ass);
            sl.source_context = loc;
            return(sl);
        }
コード例 #9
0
        public override void visit(statement_list stmtList)
        {
            var stl = new statements_list(syntaxTreeVisitor.get_location(stmtList),
                                          syntaxTreeVisitor.get_location_with_check(stmtList.left_logical_bracket),
                                          syntaxTreeVisitor.get_location_with_check(stmtList.right_logical_bracket));

            syntaxTreeVisitor.convertion_data_and_alghoritms.statement_list_stack_push(stl);
            if (stmtList.subnodes != null)
            {
                foreach (var stmt in stmtList.subnodes)
                {
                    ProcessNode(stmt);
                }
            }
            syntaxTreeVisitor.convertion_data_and_alghoritms.statement_list_stack.pop();
        }
コード例 #10
0
        public override void visit(statement_list stmtList)
        {
            if (stmtList.IsInternal) // просто обойти как продолжение объемлющего statement_list
            {
                foreach (var stmt in stmtList.subnodes)
                {
                    ProcessNode(stmt);
                }
                return;
            }

            var stl = new statements_list(_visitor.get_location(stmtList),
                                          _visitor.get_location_with_check(stmtList.left_logical_bracket),
                                          _visitor.get_location_with_check(stmtList.right_logical_bracket));

            _visitor.convertion_data_and_alghoritms.statement_list_stack_push(stl);

            var newTreeNode = new CapturedVariablesTreeNodeBlockScope(_currentTreeNode, stl.Scope.ScopeNum, stmtList);

            if (_rootNode == null)
            {
                _rootNode = newTreeNode;
            }
            if (_currentTreeNode != null)
            {
                _currentTreeNode.ChildNodes.Add(newTreeNode);
            }
            _currentTreeNode = newTreeNode;

            _scopesCapturedVarsNodesDictionary.Add(stl.Scope.ScopeNum, _currentTreeNode);
            foreach (var csi in _pendingCapturedSymbols)
            {
                _currentTreeNode.VariablesDefinedInScope.Add(csi);
            }
            _pendingCapturedSymbols.Clear();
            if (stmtList.subnodes != null)
            {
                foreach (var stmt in stmtList.subnodes)
                {
                    ProcessNode(stmt);
                }
            }

            _visitor.convertion_data_and_alghoritms.statement_list_stack.pop();

            _currentTreeNode = _currentTreeNode.ParentNode;
        }
コード例 #11
0
        public void Transform()
        {
            cas = new case_node(new ident(Consts.State));

            curStatList = new statement_list();
            case_variant cv = new case_variant(new expression_list(new int32_const(curState)), curStatList);

            cas.conditions.variants.Add(cv);

            foreach (var st in stl.subnodes)
            {
                Process(st);
            }

            stl.subnodes = BaseChangeVisitor.SeqStatements(cas, StatListAfterCase).ToList();
            //statement_list res = new statement_list(cas);
            res = stl;
        }
コード例 #12
0
        public override void visit(loop_stmt loop)
        {
            // тут возможно ошибка более глубокая - в semantic_check_sugared_statement_node(asstup) возможно остаются во вложенных лямбдах другие assign_tuple
            var sl = new statement_list();

            sl.Add(new semantic_check_sugared_statement_node(typeof(loop_stmt), new List <syntax_tree_node> {
                loop.count
            }, loop.source_context));

            var tname = "#loop_var" + UniqueNumStr();
            var fn    = new for_node(new ident(tname), new int32_const(1), loop.count, loop.stmt, loop.source_context);

            sl.Add(fn);

            ReplaceUsingParent(loop, sl);

            visit(fn);
        }
コード例 #13
0
        private static SyntaxTree.program_module InternalCreateProgramModule(statement_list statements, declarations defs)
        {
            block block = new block();

            if (defs != null)
            {
                block.defs = defs;
            }
            statements.Add(new SyntaxTree.empty_statement());
            statements.left_logical_bracket  = new token_info("begin");
            statements.right_logical_bracket = new token_info("end");
            block.program_code = statements;

            program_module res = new program_module();

            res.program_block = block;
            //res.used_units = create_standard_uses_list();
            return(res);
        }
コード例 #14
0
        /*
         * // Scope Level 0
         * begin
         *   var x = value; // Name in Scope Level 0
         *   // Scope Level 1
         *   begin
         *     var x = value; // Name in Scope Level 1 <-- REDEFENITION ERROR, x defined at Level 0
         *
         *     var y = value;
         *     var y = value2; // Name in Scope Level 1 <-- REDEFINITION ERROR, y defined at Level 1
         *
         *     // Scope Level 2
         *     begin
         *       var z = y; // Name in Scope Level 2
         *     end
         *     // Scope Level 2
         *     begin
         *       var z = value; // Name in Scope Level 2
         *     end
         *   end
         *
         * end
         */

        public override void visit(statement_list stlist)
        {
            ++CurrentLevel;

            if (BlockNamesStack.Count <= CurrentLevel)
            {
                // Создаем множество имен для текущего уровня вложенности мини-пространства имен
                BlockNamesStack.Add(new HashSet <string>());
            }


            base.visit(stlist);
            //for (var i = 0; i < stlist.list.Count; ++i)
            //    ProcessNode(stlist.list[i]);

            BlockNamesStack.RemoveAt(BlockNamesStack.Count - 1);

            --CurrentLevel;
        }
コード例 #15
0
        public void ReplaceStatement(statement from, IEnumerable <statement> to, Desc d = Desc.DirectDescendants)
        {
            foreach (var x in to)
            {
                x.Parent = from.Parent;
            }
            var sl = from.Parent as statement_list;

            if (sl != null)
            {
                sl.ReplaceInList(from, to);
            }
            else
            {
                var l = new statement_list();
                l.AddMany(to);
                l.source_context = from.source_context;
                from.Parent.ReplaceDescendant(from, l, d);
            }
        }
コード例 #16
0
        public override void visit(slice_expr sl)
        {
            var el = construct_expression_list_for_slice_expr(sl);

            if (sl.Parent is assign parent_assign && parent_assign.to == sl)
            {
                el.Insert(0, parent_assign.from);
                var mc = method_call.NewP(
                    dot_node.NewP(
                        sl.v,
                        new ident("SystemSliceAssignment", sl.v.source_context),
                        sl.v.source_context),
                    el, sl.source_context);
                var systemSliceAssignmentCall   = new procedure_call(mc, sl.source_context);
                var typeCompatibilityCheck      = GetAssignmentTypeCompatibilityCheck(sl, parent_assign.from, mc);
                var checkAndDesugaredSliceBlock = new statement_list(typeCompatibilityCheck, systemSliceAssignmentCall);
                checkAndDesugaredSliceBlock.source_context = sl.source_context;
                ReplaceUsingParent(parent_assign, checkAndDesugaredSliceBlock);
                visit(systemSliceAssignmentCall); // обойти заменённое на предмет наличия такого же синтаксического сахара
            }
コード例 #17
0
        public override void visit(statement_list stlist)
        {
            ++CurrentLevel;

            if (BlockNamesStack.Count <= CurrentLevel)
            {
                // Создаем отображение для имен текущего уровня вложенности мини-пространства имен
                BlockNamesStack.Add(new Dictionary <string, string>());
            }

            //base.visit(stlist);
            for (var i = 0; i < stlist.list.Count; ++i)
            {
                ProcessNode(stlist.list[i]);
            }

            BlockNamesStack.RemoveAt(BlockNamesStack.Count - 1);

            --CurrentLevel;
        }
コード例 #18
0
        public void ReplaceStatementUsingParent(statement from, IEnumerable <statement> to, Desc d = Desc.DirectDescendants)
        {
            var fp = from.Parent; // SSM 02.10.18 - запомним, т.к. from.Parent может быть одним из x.Parent
            //foreach (var x in to) // Это и так делается по обоим веткам!
            //    x.Parent = fp;
            var sl = fp as statement_list;

            if (sl != null)
            {
                sl.ReplaceInList(from, to);
            }
            else
            {
                var l = new statement_list();
                l.AddMany(to);
                l.source_context = from.source_context;
                fp.ReplaceDescendant(from, l, d);
                l.Parent = fp; // на всякий случай
            }
        }
コード例 #19
0
        public void ReplaceStatementUsingParent(statement from, IEnumerable <statement> to, Desc d = Desc.DirectDescendants)
        {
            var fp = from.Parent; // SSM 02.10.18 - запомним, т.к. from.Parent может быть одним из x.Parent

            foreach (var x in to)
            {
                x.Parent = fp;
            }
            var sl = fp as statement_list;

            if (sl != null)
            {
                sl.ReplaceInList(from, to);
            }
            else
            {
                var l = new statement_list();
                l.AddMany(to);
                l.source_context = from.source_context;
                fp.ReplaceDescendant(from, l, d);
            }
        }
コード例 #20
0
        public virtual statement_list GetStatements(object _object)
        {
            statement_list _statement_list;

            if (_object is statement_list)
            {
                _statement_list = _object as statement_list;
            }
            else
            {
                _statement_list = new statement_list();
                if (_object is statement)
                {
                    _statement_list.subnodes.Add(_object as statement);
                }
                else
                {
                    _statement_list.subnodes.Add(new empty_statement());
                }
            }
            return(_statement_list);
        }
コード例 #21
0
        public override void visit(while_node wn)
        {
            ProcessNode(wn.statements);
            var gt1 = new goto_statement(newLabelName());
            var gt2 = new goto_statement(newLabelName());
            var gt3 = new goto_statement(newLabelName());

            var if0 = new if_node(wn.expr, gt1, null);
            var lb3 = new labeled_statement(gt3.label, if0);
            var lb1 = new labeled_statement(gt1.label, wn.statements);
            var lb2 = new labeled_statement(gt2.label, new empty_statement());

            var stl = new statement_list(lb3, gt2, lb1, gt3, lb2);

            Replace(wn, stl);
            // в declarations ближайшего блока добавить описание labels
            block bl = listNodes.FindLast(x => x is block) as block;

            var ld = new label_definitions(gt1.label, gt2.label, gt3.label);

            bl.defs.Add(ld);
        }
コード例 #22
0
        /// <summary>
        /// Фиктивный блок, представляющий лямбда-выражение. Используется для обхода с целью получения списка захватываемых переменных
        /// </summary>
        /// <param name="lambdaDef"></param>
        /// <returns></returns>
        public static block CreateFictiveBlockForLambda(function_lambda_definition lambdaDef)
        {
            statement_list stmtList = new statement_list();

            if (lambdaDef.formal_parameters != null)
            {
                for (int i = 0; i < lambdaDef.formal_parameters.params_list.Count; i++)
                {
                    stmtList.subnodes.Add(SyntaxTreeNodesConstructor.CreateVarStatementNode(lambdaDef.formal_parameters.params_list[i].idents,
                                                                                            lambdaDef.formal_parameters.params_list[i].vars_type,
                                                                                            null));
                }
            }
            if (lambdaDef.return_type != null)
            {
                stmtList.subnodes.Add(SyntaxTreeNodesConstructor.CreateVarStatementNode("result", lambdaDef.return_type, null)); // переделать, не сработает, если тип возвращаемого значения не указан
            }
            stmtList.subnodes.AddRange((lambdaDef.proc_body as statement_list).subnodes);
            block resBlock = new block();

            resBlock.program_code = stmtList;
            return(resBlock);
        }
コード例 #23
0
        public override void Exit(syntax_tree_node st)
        {
            var sts = st as statement;

            if (sts != null && !(sts is statement_list) && !(sts is case_variant) && !(UpperNode() is statement_list))
            {
                // Одиночный оператор
                var stl = new statement_list(sts, st.source_context);
                Replace(sts, stl);
            }


            var lst = st as labeled_statement;

            if (lst != null && !(lst.to_statement is statement_list) && !(lst.to_statement is case_variant))
            {
                // Одиночный оператор
                var stl = new statement_list(sts, st.source_context);
                Replace(lst.to_statement, stl);
            }

            base.Exit(st);
        }
コード例 #24
0
        public static void Substitute(syntax_tree_visitor _visitor, declarations decls, statement_list _statementList)
        {
            var tree   = new CapturedVariablesTreeBuilder(_visitor).BuildTree(_statementList);
            var substs = new CapturedVariablesSubstitutionClassGenerator(tree.RootNode).GenerateSubstitutions();

            new CapturedVariablesSubstitutor(tree.IdentsReferences, substs.GeneratedScopeClassesInfo, substs.LambdasToBeAddedAsMethods, substs.SubstitutionsInfo, tree.CapturedVarsNodesDictionary, substs.ConvertingClassNonPublicMembersMapping, _visitor)
            .Substitute(_statementList);

            if (_visitor.context.converting_block() == block_type.function_block && tree.ProcedureScope != null)
            {
                if (decls != null && decls.defs != null)
                {
                    foreach (var def in decls.defs.Where(d => d is const_definition ||
                                                         d is consts_definitions_list ||
                                                         d is variable_definitions))
                    {
                        var constDef = def as const_definition;
                        if (constDef != null)
                        {
                            var finder = new FindMainIdentsVisitor();
                            finder.ProcessNode(constDef.const_value);

                            foreach (var v in finder.vars)
                            {
                                SymbolInfo si = _visitor.context.find_first(v.name);
                                if (si == null)
                                {
                                    continue;
                                }

                                if (tree.ProcedureScope.VariablesDefinedInScope.Any(var => var.SymbolInfo == si))
                                {
                                    _visitor.AddError(new UsingCapturedParameterIsNotAllowedInInitializers(_visitor.get_location(v)));
                                }
                            }
                            continue;
                        }

                        var constDefList = def as consts_definitions_list;
                        if (constDefList != null)
                        {
                            foreach (var cd in constDefList.const_defs)
                            {
                                var finder = new FindMainIdentsVisitor();
                                finder.ProcessNode(cd.const_value);

                                foreach (var v in finder.vars)
                                {
                                    SymbolInfo si = _visitor.context.find_first(v.name);
                                    if (si == null)
                                    {
                                        continue;
                                    }

                                    if (tree.ProcedureScope.VariablesDefinedInScope.Any(var => var.SymbolInfo == si))
                                    {
                                        _visitor.AddError(new UsingCapturedParameterIsNotAllowedInInitializers(_visitor.get_location(v)));
                                    }
                                }
                            }
                            continue;
                        }

                        var varDefList = def as variable_definitions;
                        if (varDefList != null)
                        {
                            foreach (var d in varDefList.var_definitions)
                            {
                                var finder = new FindMainIdentsVisitor();
                                finder.ProcessNode(d.inital_value);

                                foreach (var v in finder.vars)
                                {
                                    SymbolInfo si = _visitor.context.find_first(v.name);
                                    if (si == null)
                                    {
                                        continue;
                                    }

                                    if (tree.ProcedureScope.VariablesDefinedInScope.Any(var => var.SymbolInfo == si))
                                    {
                                        _visitor.AddError(new UsingCapturedParameterIsNotAllowedInInitializers(_visitor.get_location(v)));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #25
0
        public ident func_decl_lambda(object lr0, object lr2)
        {
            statement_list    _statement_list    = (statement_list)lr2;
            expression_list   _expression_list   = new expression_list();
            ident_list        _i_l               = new ident_list();
            formal_parameters _formal_parameters = new formal_parameters();

            if (lr0 != null)
            {
                List <object> ar = (List <object>)lr0;
                for (int i = 0; i < ar.Count; i++)
                {
                    if (ar[i] is ident)
                    {
                        _i_l.idents.Add((ident)ar[i]);
                    }
                    else
                    {
                        _i_l.idents.Add(((var_def_statement)ar[i]).vars.idents[0]);
                    }
                }

                for (int i = 0; i < _i_l.idents.Count; i++)
                {
                    _expression_list.expressions.Add(_i_l.idents[i]);
                }

                for (int i = 0; i < ar.Count; i++)
                {
                    ident_list _ident_list = new ident_list();
                    ident      id          = _i_l.idents[i];
                    _ident_list.idents.Add(id);
                    string           name_param        = id.name;
                    typed_parameters _typed_parameters = null;
                    int k = 0;
                    {
                        named_type_reference _named_type_reference = new named_type_reference();
                        type_definition      t_d = new type_definition();
                        if (ar[i] is ident)
                        {
                            ident idtype = new ident("object");
                            _named_type_reference.names.Add(idtype);
                            t_d = (type_definition)_named_type_reference;
                        }
                        else
                        {
                            t_d = ((var_def_statement)ar[i]).vars_type;
                        }
                        _typed_parameters = new typed_parameters(_ident_list, t_d, parametr_kind.none, null);
                        //parsertools.create_source_context(_typed_parameters, _ident_list, t_d);
                    }
                    _formal_parameters.params_list.Add(_typed_parameters);
                }
            }
            //////////////////////////
            named_type_reference _named_type_reference1 = new named_type_reference();
            ident idtype1 = new ident("object");

            _named_type_reference1.source_context = idtype1.source_context;
            _named_type_reference1.names.Add(idtype1);
            /////////////////////////////
            lambda_num++;
            function_lambda_definition _procedure_definition = new function_lambda_definition();

            _procedure_definition.formal_parameters = _formal_parameters;
            _procedure_definition.return_type       = (type_definition)_named_type_reference1;
            _procedure_definition.ident_list        = _i_l;
            _procedure_definition.proc_body         = null;
            _procedure_definition.parameters        = _expression_list;
            _procedure_definition.lambda_name       = "__lambda__" + lambda_num;
            //new function_lambda_definition(_formal_parameters, (type_definition)_named_type_reference1, _i_l, null, _expression_list, "lambda" + lambda_num);
            object rt = _i_l;

            _procedure_definition.proc_body = _statement_list;

            //////////////////////////////vnutrennie lambda
            if (_procedure_definition.defs == null)
            {
                _procedure_definition.defs = new List <declaration>();
            }
            while (pascalABC_lambda_definitions.Count > 0 && pascalABC_lambda_definitions[pascalABC_lambda_definitions.Count - 1] != null)
            {
                _procedure_definition.defs.Add(lambda((function_lambda_definition)pascalABC_lambda_definitions[pascalABC_lambda_definitions.Count - 1]));
                pascalABC_lambda_definitions.RemoveAt(pascalABC_lambda_definitions.Count - 1);
            }
            if (pascalABC_lambda_definitions.Count > 0 && pascalABC_lambda_definitions[pascalABC_lambda_definitions.Count - 1] == null)
            {
                pascalABC_lambda_definitions.RemoveAt(pascalABC_lambda_definitions.Count - 1);
            }
            pascalABC_lambda_definitions.Add(_procedure_definition);
            ///////////////////////////////////////////////
            //parsertools.create_source_context(_procedure_definition, _expression_list, rt);
            ident _name = new ident(_procedure_definition.lambda_name);

            if (lr0 != null)
            {
                _name.source_context = _i_l.idents[0].source_context;
            }
            return(_name);
        }
コード例 #26
0
        /// <summary>
        /// Преобразует foreach в for, если коллекция это одномерный массив.
        /// </summary>
        /// <param name="_foreach_stmt"></param>
        /// <param name="in_what"></param>
        /// <returns>True - если преобразование удалось, иначе False</returns>
        private bool OptimizeForeachInCase1DArray(foreach_stmt _foreach_stmt, expression_node in_what)
        {
            var is1dimdynarr = false;
            var comptn       = in_what.type as compiled_type_node;

            if (comptn != null && comptn.type_special_kind == type_special_kind.array_kind && comptn.rank == 1)
            {
                is1dimdynarr = true;
            }
            if (!is1dimdynarr)
            {
                var comtn = in_what.type as common_type_node;
                if (comtn != null && comtn.internal_type_special_kind == type_special_kind.array_kind &&
                    comtn.rank == 1)
                {
                    is1dimdynarr = true;
                }
            }


            // SSM 23.08.16 Закомментировал оптимизацию. Не работает с лямбдами. Лямбды обходят старое дерево. А заменить foreach на for на этом этапе пока не получается - не развита инфраструктура

            if (is1dimdynarr) // Замена foreach на for для массива
            {
                // сгенерировать код для for и вызвать соответствующий visit
                var arrid = GenIdentName();
                //var vdarr = new var_statement(arrid, new semantic_addr_value(in_what)); // semantic_addr_value - перевод в синтаксис для мгновенного вычисления семантического выражения, которое уже вычислено в in_what
                var vdarr = new var_statement(arrid, _foreach_stmt.in_what);

                var i = GenIdentName();
                var x = _foreach_stmt.identifier;

                // Возможны 3 случая:
                // 1. _foreach_stmt.type_name = null - значит, переменная определена в другом месте
                // 2. _foreach_stmt.type_name = no_type_foreach - значит, это for var x in a
                // 3. _foreach_stmt.type_name = T - значит, это for var x: T in a

                statement vd;
                if (_foreach_stmt.type_name == null) // 1.
                {
                    vd = new assign(x, arrid.indexer(i));
                }
                else if (_foreach_stmt.type_name is no_type_foreach) // 2.
                {
                    vd = new var_statement(x, arrid.indexer(i));
                }
                else // 3.
                {
                    vd = new var_statement(x, _foreach_stmt.type_name, arrid.indexer(i));
                }

                // Превратить старое тело в statement_list и добавить к нему в начало x := a[i] или var x := a[i]
                var newbody = _foreach_stmt.stmt.ToStatementList();
                newbody.AddFirst(vd);

                var high = arrid.dot_node("Length").Minus(1);

                var fornode = new for_node(i, 0, high, newbody, for_cycle_type.to, null, null, true);

                var stl = new statement_list(vdarr, fornode);
                // Замена 1 оператора на 1 оператор. Всё хорошо даже если оператор помечен меткой
                ReplaceUsingParent(_foreach_stmt, stl);

                visit(stl);
                //visit(vdarr);
                //visit(fornode);

                return(true);
            }
            /// SSM 29.07.16
            return(false);
        }
コード例 #27
0
        public override void visit(PascalABCCompiler.SyntaxTree.for_node _for_node)
        {
            var loc1           = _visitor.get_location(_for_node.loop_variable);
            var loopIdentName  = _for_node.loop_variable.name.ToLower();
            var nodesToProcess = new List <syntax_tree_node>();

            var_definition_node vdn;
            var initv = _visitor.convert_strong(_for_node.initial_value);
            var tmp   = initv;

            if (initv is typed_expression)
            {
                initv = _visitor.convert_typed_expression_to_function_call(initv as typed_expression);
            }

            if (initv.type == null)
            {
                initv = tmp;
            }

            var headStmts = new statements_list(loc1);

            _visitor.convertion_data_and_alghoritms.statement_list_stack_push(headStmts);

            var newTreeNode = new CapturedVariablesTreeNodeForScope(_currentTreeNode, headStmts.Scope.ScopeNum, _for_node);

            if (_currentTreeNode != null)
            {
                _currentTreeNode.ChildNodes.Add(newTreeNode);
            }
            _currentTreeNode = newTreeNode;

            _scopesCapturedVarsNodesDictionary.Add(headStmts.Scope.ScopeNum, _currentTreeNode);


            if (_for_node.type_name == null && !_for_node.create_loop_variable)
            {
                var dn = _visitor.context.check_name_node_type(loopIdentName, loc1, general_node_type.variable_node);
                vdn = (var_definition_node)dn;
                nodesToProcess.Add(_for_node.loop_variable);
            }
            else
            {
                var tn = _for_node.type_name != null?_visitor.convert_strong(_for_node.type_name) : initv.type;

                vdn = _visitor.context.add_var_definition(loopIdentName,
                                                          _visitor.get_location(_for_node.loop_variable), tn,
                                                          polymorphic_state.ps_common);

                _currentTreeNode.VariablesDefinedInScope.Add(new CapturedVariablesTreeNode.CapturedSymbolInfo(_for_node, _visitor.context.find(loopIdentName)));
            }


            newTreeNode.SymbolInfoLoopVar = _visitor.context.find(loopIdentName);

            var fn = new PascalABCCompiler.TreeRealization.for_node(null, null, null, null, null, _visitor.get_location(_for_node));

            if (vdn.type == SystemLibrary.bool_type)
            {
                fn.bool_cycle = true;
            }
            _visitor.context.cycle_stack.push(fn);
            _visitor.context.loop_var_stack.Push(vdn);

            nodesToProcess.Add(_for_node.initial_value);
            nodesToProcess.Add(_for_node.finish_value);
            nodesToProcess.Add(_for_node.increment_value);

            foreach (var n in nodesToProcess)
            {
                ProcessNode(n);
            }

            if (!(_for_node.statements is statement_list))
            {
                var stmtList = new statement_list(_for_node.statements, _for_node.statements.source_context);
                _for_node.statements = stmtList;
            }
            ProcessNode(_for_node.statements);

            _visitor.context.cycle_stack.pop();
            _visitor.context.loop_var_stack.Pop();
            _visitor.convertion_data_and_alghoritms.statement_list_stack.pop();

            _currentTreeNode = _currentTreeNode.ParentNode;
        }
コード例 #28
0
        public override void visit(foreach_stmt _foreach_stmt)
        {
            var loopIdentName = _foreach_stmt.identifier.name.ToLower();

            definition_node     dn  = null;
            var_definition_node vdn = null;

            var sl2 = new statements_list(_visitor.get_location(_foreach_stmt));

            _visitor.convertion_data_and_alghoritms.statement_list_stack_push(sl2);

            var newTreeNode = new CapturedVariablesTreeNodeForEachScope(_currentTreeNode, sl2.Scope.ScopeNum, _foreach_stmt);

            if (_currentTreeNode != null)
            {
                _currentTreeNode.ChildNodes.Add(newTreeNode);
            }
            _currentTreeNode = newTreeNode;

            _scopesCapturedVarsNodesDictionary.Add(sl2.Scope.ScopeNum, _currentTreeNode);

            var inWhat = _visitor.convert_strong(_foreach_stmt.in_what);
            var tmp    = inWhat;

            if (inWhat is typed_expression)
            {
                inWhat = _visitor.convert_typed_expression_to_function_call(inWhat as typed_expression);
            }

            type_node elemType = null;

            if (inWhat.type == null)
            {
                inWhat = tmp;
            }

            _visitor.FindIEnumerableElementType(/*_foreach_stmt, */ inWhat.type, ref elemType);

            if (_foreach_stmt.type_name == null)
            {
                var loc1 = _visitor.get_location(_foreach_stmt.identifier);
                dn  = _visitor.context.check_name_node_type(loopIdentName, loc1, general_node_type.variable_node);
                vdn = (var_definition_node)dn;
            }
            else
            {
                vdn = _visitor.context.add_var_definition(loopIdentName, _visitor.get_location(_foreach_stmt.identifier));

                type_node tn;
                if (_foreach_stmt.type_name is no_type_foreach)
                {
                    tn = elemType;
                }
                else
                {
                    tn = _visitor.convert_strong(_foreach_stmt.type_name);
                    _visitor.check_for_type_allowed(tn, _visitor.get_location(_foreach_stmt.type_name));
                }


                _visitor.context.close_var_definition_list(tn, null);

                _currentTreeNode.VariablesDefinedInScope.Add(new CapturedVariablesTreeNode.CapturedSymbolInfo(_foreach_stmt, _visitor.context.find(loopIdentName)));
            }

            newTreeNode.SymbolInfoLoopVar = _visitor.context.find(loopIdentName);

            if (!(vdn.type is compiled_generic_instance_type_node))
            {
                _visitor.convertion_data_and_alghoritms.check_convert_type_with_inheritance(vdn.type, elemType, _visitor.get_location(_foreach_stmt.identifier));
            }

            var fn = new foreach_node(vdn, inWhat, null, _visitor.get_location(_foreach_stmt));

            _visitor.context.cycle_stack.push(fn);
            _visitor.context.loop_var_stack.Push(vdn);

            ProcessNode(_foreach_stmt.in_what);

            if (!(_foreach_stmt.stmt is statement_list))
            {
                var stmtList = new statement_list(_foreach_stmt.stmt, _foreach_stmt.stmt.source_context);
                _foreach_stmt.stmt = stmtList;
            }

            ProcessNode(_foreach_stmt.stmt);

            _visitor.context.loop_var_stack.Pop();
            _visitor.convertion_data_and_alghoritms.statement_list_stack.pop();
            _visitor.context.cycle_stack.pop();

            _currentTreeNode = _currentTreeNode.ParentNode;
        }
コード例 #29
0
        private statement_list ConvertIfNode(if_node ifNode, List <statement> statementsBeforeIf, out statement elseBody)
        {
            // if e then <then> else <else>
            //
            // переводим в
            //
            // begin
            //   statementsBeforeIf
            //   if e then begin <then>; goto end_if end;
            // end
            // <else>
            // end_if: empty_statement

            // if e then <then>
            //
            // переводим в
            //
            // begin
            //   statementsBeforeIf
            //   if e then <then>
            // end

            // Добавляем, чтобы на конвертировать еще раз, если потребуется
            processedIfNodes.Add(ifNode);

            var statementsBeforeAndIf = new statement_list();

            statementsBeforeAndIf.AddMany(statementsBeforeIf);
            statementsBeforeAndIf.Add(ifNode);

            if (ifNode.else_body == null)
            {
                elseBody = null;
                return(statementsBeforeAndIf);
            }
            else
            {
                var result = new statement_list();
                result.Add(statementsBeforeAndIf);
                var endIfLabel = NewEndIfName();
                // добавляем метку
                if (!(ifNode.then_body is statement_list))
                {
                    ifNode.then_body        = new statement_list(ifNode.then_body, ifNode.then_body.source_context);
                    ifNode.then_body.Parent = ifNode;
                }

                var thenBody = ifNode.then_body as statement_list;
                thenBody.Add(new goto_statement(endIfLabel));
                // добавляем else и метку за ним
                result.Add(ifNode.else_body);
                result.Add(new labeled_statement(endIfLabel));
                // Возвращаем else для обхода, т.к. он уже не входит в if
                elseBody = ifNode.else_body;
                // удаляем else из if
                ifNode.else_body = null;
                // Добавляем метку
                AddLabel(endIfLabel);

                return(result);
            }
        }
コード例 #30
0
 private void AddDefaultCase(statement_list statements)
 {
     AddDesugaredCaseToResult(statements, _previousIf);
 }
コード例 #31
0
 public override void visit(statement_list _statement_list)
 {
     //text="Count: "+_statement_list.subnodes.Count;
     get_count(_statement_list.subnodes);
 }
コード例 #32
0
		public virtual void visit(statement_list _statement_list)
		{
		}
コード例 #33
0
		public virtual void post_do_visit(statement_list _statement_list)
		{
		}
コード例 #34
0
		public override void visit(statement_list _statement_list)
		{
			DefaultVisit(_statement_list);
			pre_do_visit(_statement_list);
			for (int i = 0; i < subnodes.Count; i++)
				visit(statement_list.subnodes[i]);
			visit(statement_list.left_logical_bracket);
			visit(statement_list.right_logical_bracket);
			post_do_visit(_statement_list);
		}
コード例 #35
0
		public virtual void visit(statement_list _statement_list)
		{
			DefaultVisit(_statement_list);
		}